You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

config.go 1.4 kB

10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package config
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "github.com/imdario/mergo"
  7. "gitlink.org.cn/cloudream/common/utils/serder/json"
  8. "gitlink.org.cn/cloudream/common/utils/serder/json/exts"
  9. )
  10. var serder json.Serder
  11. func init() {
  12. cfg := json.New()
  13. cfg = cfg.UseExtension(exts.NewDuration())
  14. serder = cfg.Build()
  15. }
  16. // Load 从本地文件读取配置,加载配置文件
  17. func Load(filePath string, cfg interface{}) error {
  18. fileData, err := os.ReadFile(filePath)
  19. if err != nil {
  20. return err
  21. }
  22. // json.Unmarshal用于将JSON解码成结构体
  23. return serder.Decode(fileData, cfg)
  24. }
  25. // DefaultLoad 默认的加载配置的方式:
  26. // 从应用程序上上级的conf目录中读取,文件名:<moduleName>.config.json
  27. func DefaultLoad(modeulName string, defCfg interface{}) error {
  28. // 获取当前进程文件执行路径,并判断是否为空
  29. execPath, err := os.Executable()
  30. if err != nil {
  31. return err
  32. }
  33. // TODO 可以考虑根据环境变量读取不同的配置
  34. // filepath.Join用于将多个路径组合成一个路径
  35. configFilePath := filepath.Join(filepath.Dir(execPath), "..", "confs", fmt.Sprintf("%s.config.json", modeulName))
  36. return Load(configFilePath, defCfg)
  37. }
  38. // Merge 合并两个配置结构体。会将src中的非空字段覆盖到dst的同名字段中。两个结构的类型必须相同
  39. func Merge(dst interface{}, src interface{}) error {
  40. return mergo.Merge(dst, src)
  41. }