package config import ( "fmt" "os" "path/filepath" "github.com/imdario/mergo" "gitlink.org.cn/cloudream/common/utils/serder/json" "gitlink.org.cn/cloudream/common/utils/serder/json/exts" ) var serder json.Serder func init() { cfg := json.New() cfg = cfg.UseExtension(exts.NewDuration()) serder = cfg.Build() } // Load 从本地文件读取配置,加载配置文件 func Load(filePath string, cfg interface{}) error { fileData, err := os.ReadFile(filePath) if err != nil { return err } // json.Unmarshal用于将JSON解码成结构体 return serder.Decode(fileData, cfg) } // DefaultLoad 默认的加载配置的方式: // 从应用程序上上级的conf目录中读取,文件名:.config.json func DefaultLoad(modeulName string, defCfg interface{}) error { // 获取当前进程文件执行路径,并判断是否为空 execPath, err := os.Executable() if err != nil { return err } // TODO 可以考虑根据环境变量读取不同的配置 // filepath.Join用于将多个路径组合成一个路径 configFilePath := filepath.Join(filepath.Dir(execPath), "..", "confs", fmt.Sprintf("%s.config.json", modeulName)) return Load(configFilePath, defCfg) } // Merge 合并两个配置结构体。会将src中的非空字段覆盖到dst的同名字段中。两个结构的类型必须相同 func Merge(dst interface{}, src interface{}) error { return mergo.Merge(dst, src) }