fix config collapse when instances were written in more than one file(config)

This commit is contained in:
kongfei 2022-09-06 22:46:03 +08:00
parent 4abd2782b8
commit 21a6111b87
2 changed files with 62 additions and 12 deletions

View File

@ -80,6 +80,15 @@ func NewProvider(c *config.ConfigType, reloadFunc func()) (Provider, error) {
providers = append(providers, provider)
}
}
// 不添加provider配置 则默认使用local
// 兼容老版本
if len(providers) == 0 {
provider, err := newLocalProvider(c)
if err != nil {
return nil, err
}
providers = append(providers, provider)
}
return &ProviderManager{
providers: providers,
}, nil
@ -224,7 +233,7 @@ func (lp *LocalProvider) GetInputConfig(inputKey string) ([]cfg.ConfigWithFormat
return nil, fmt.Errorf("failed to list files under: %s : %v", lp.configDir, err)
}
cwf := make([]cfg.ConfigWithFormat, 0, 1)
cwf := make([]cfg.ConfigWithFormat, 0, len(files))
for _, f := range files {
c, err := file.ReadBytes(path.Join(lp.configDir, inputFilePrefix+inputKey, f))
if err != nil {

View File

@ -1,7 +1,10 @@
package cfg
import (
"bytes"
"fmt"
"io"
"os"
"path"
"strings"
@ -32,7 +35,20 @@ func GuessFormat(fpath string) ConfigFormat {
return TomlFormat
}
func readFile(fname string) ([]byte, error) {
file, err := os.Open(fname)
if err != nil {
return nil, err
}
defer file.Close()
return io.ReadAll(file)
}
func LoadConfigByDir(configDir string, configPtr interface{}) error {
var (
tBuf, yBuf, jBuf []byte
)
loaders := []multiconfig.Loader{
&multiconfig.TagLoader{},
&multiconfig.EnvironmentLoader{},
@ -44,26 +60,41 @@ func LoadConfigByDir(configDir string, configPtr interface{}) error {
}
for _, fpath := range files {
if strings.HasSuffix(fpath, ".toml") {
loaders = append(loaders, &multiconfig.TOMLLoader{Path: path.Join(configDir, fpath)})
buf, err := readFile(path.Join(configDir, fpath))
if err != nil {
return err
}
if strings.HasSuffix(fpath, ".json") {
loaders = append(loaders, &multiconfig.JSONLoader{Path: path.Join(configDir, fpath)})
}
if strings.HasSuffix(fpath, ".yaml") || strings.HasSuffix(fpath, ".yml") {
loaders = append(loaders, &multiconfig.YAMLLoader{Path: path.Join(configDir, fpath)})
switch {
case strings.HasSuffix(fpath, "toml"):
tBuf = append(tBuf, buf...)
case strings.HasSuffix(fpath, "json"):
jBuf = append(jBuf, buf...)
case strings.HasSuffix(fpath, "yaml") || strings.HasSuffix(fpath, "yml"):
yBuf = append(yBuf, buf...)
}
}
if len(tBuf) != 0 {
loaders = append(loaders, &multiconfig.TOMLLoader{Reader: bytes.NewReader(tBuf)})
}
if len(yBuf) != 0 {
loaders = append(loaders, &multiconfig.YAMLLoader{Reader: bytes.NewReader(yBuf)})
}
if len(jBuf) != 0 {
loaders = append(loaders, &multiconfig.JSONLoader{Reader: bytes.NewReader(jBuf)})
}
m := multiconfig.DefaultLoader{
Loader: multiconfig.MultiLoader(loaders...),
Validator: multiconfig.MultiValidator(&multiconfig.RequiredValidator{}),
}
return m.Load(configPtr)
}
func LoadConfigs(configs []ConfigWithFormat, configPtr interface{}) error {
var (
tBuf, yBuf, jBuf []byte
)
loaders := []multiconfig.Loader{
&multiconfig.TagLoader{},
&multiconfig.EnvironmentLoader{},
@ -71,14 +102,24 @@ func LoadConfigs(configs []ConfigWithFormat, configPtr interface{}) error {
for _, c := range configs {
switch c.Format {
case TomlFormat:
loaders = append(loaders, &multiconfig.TOMLLoader{Reader: strings.NewReader(c.Config)})
tBuf = append(tBuf, []byte(c.Config)...)
case YamlFormat:
loaders = append(loaders, &multiconfig.YAMLLoader{Reader: strings.NewReader(c.Config)})
yBuf = append(yBuf, []byte(c.Config)...)
case JsonFormat:
loaders = append(loaders, &multiconfig.JSONLoader{Reader: strings.NewReader(c.Config)})
jBuf = append(jBuf, []byte(c.Config)...)
}
}
if len(tBuf) != 0 {
loaders = append(loaders, &multiconfig.TOMLLoader{Reader: bytes.NewReader(tBuf)})
}
if len(yBuf) != 0 {
loaders = append(loaders, &multiconfig.YAMLLoader{Reader: bytes.NewReader(yBuf)})
}
if len(jBuf) != 0 {
loaders = append(loaders, &multiconfig.JSONLoader{Reader: bytes.NewReader(jBuf)})
}
m := multiconfig.DefaultLoader{
Loader: multiconfig.MultiLoader(loaders...),
Validator: multiconfig.MultiValidator(&multiconfig.RequiredValidator{}),