config.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Package config 负责配置信息
  2. package config
  3. import (
  4. "os"
  5. "github.com/runningwater/gohub/pkg/helpers"
  6. "github.com/spf13/cast"
  7. viperlib "github.com/spf13/viper" // 自定义包名,避免与内置 viper 实例冲突
  8. )
  9. // viper 库实例
  10. var viper *viperlib.Viper
  11. // ConfigFunc 动态加载配置信息
  12. type ConfigFunc func() map[string]any
  13. // ConfigFuncs 先加载到此数组,loadConfig 再动态生成配置信息
  14. var ConfigFuncs map[string]ConfigFunc
  15. func init() {
  16. // 1. 初始化 Viper 库
  17. viper = viperlib.New()
  18. // 2. 配置类型,支持 "json", "toml", "yaml", "yml", "properties",
  19. // "props", "prop", "env", "dotenv"
  20. viper.SetConfigType("env")
  21. // 3. 环境变量配置文件查找的路径,相对于 main.go
  22. viper.AddConfigPath(".")
  23. // 4. 设置环境变量前缀,用以区分 Go 的系统环境变量
  24. viper.SetEnvPrefix("appenv")
  25. // 5. 读取环境变量(支持 flags)
  26. viper.AutomaticEnv()
  27. ConfigFuncs = make(map[string]ConfigFunc)
  28. }
  29. // InitConfig 初始化配置信息,完成对环境变量以及 config 信息的加载
  30. func InitConfig(env string) {
  31. // 1. 加载环境变量
  32. loadEnv(env)
  33. // 2. 注册配置信息
  34. loadConfig()
  35. }
  36. func loadConfig() {
  37. for name, fn := range ConfigFuncs {
  38. viper.Set(name, fn())
  39. }
  40. }
  41. func loadEnv(envSuffix string) {
  42. // 默认加载 .env 文件,如果有传参 --env=name 的话,加载 .env.name 文件
  43. envPath := ".env"
  44. if len(envSuffix) > 0 {
  45. filepath := ".env." + envSuffix
  46. if _, err := os.Stat(filepath); err == nil {
  47. // 如 .env.testing 或 .env.stage
  48. envPath = filepath
  49. }
  50. }
  51. // 加载 env
  52. viper.SetConfigName(envPath)
  53. if err := viper.ReadInConfig(); err != nil {
  54. panic(err)
  55. }
  56. // 监控 .env 文件,变更时重新加载
  57. viper.WatchConfig()
  58. }
  59. // Env 读取环境变量,支持默认值
  60. func Env(envName string, defaultValue ...any) any {
  61. if len(defaultValue) > 0 {
  62. return internalGet(envName, defaultValue[0])
  63. }
  64. return internalGet(envName)
  65. }
  66. // Add 新增配置项
  67. func Add(name string, configFn ConfigFunc) {
  68. ConfigFuncs[name] = configFn
  69. }
  70. // Get 获取配置项
  71. // 第一个参数 path 允许使用点式获取,如:app.name
  72. // 第二个参数允许传参默认值
  73. func Get(path string, defaultValue ...any) string {
  74. return GetString(path, defaultValue...)
  75. }
  76. func internalGet(path string, defaultValue ...any) any {
  77. // config 或者环境变量不存在的情况
  78. if !viper.IsSet(path) || helpers.Empty(viper.Get(path)) {
  79. if len(defaultValue) > 0 {
  80. return defaultValue[0]
  81. }
  82. return nil
  83. }
  84. return viper.Get(path)
  85. }
  86. // GetString 获取 String 类型的配置信息
  87. func GetString(path string, defaultValue ...any) string {
  88. return cast.ToString(internalGet(path, defaultValue...))
  89. }
  90. // GetInt 获取 Int 类型的配置信息
  91. func GetInt(path string, defaultValue ...any) int {
  92. return cast.ToInt(internalGet(path, defaultValue...))
  93. }
  94. // GetFloat64 获取 float64 类型的配置信息
  95. func GetFloat64(path string, defaultValue ...any) float64 {
  96. return cast.ToFloat64(internalGet(path, defaultValue...))
  97. }
  98. // GetInt64 获取 Int64 类型的配置信息
  99. func GetInt64(path string, defaultValue ...any) int64 {
  100. return cast.ToInt64(internalGet(path, defaultValue...))
  101. }
  102. // GetUint 获取 Uint 类型的配置信息
  103. func GetUint(path string, defaultValue ...any) uint {
  104. return cast.ToUint(internalGet(path, defaultValue...))
  105. }
  106. // GetBool 获取 Bool 类型的配置信息
  107. func GetBool(path string, defaultValue ...any) bool {
  108. return cast.ToBool(internalGet(path, defaultValue...))
  109. }
  110. // GetStringMapString 获取结构数据
  111. func GetStringMapString(path string) map[string]string {
  112. return viper.GetStringMapString(path)
  113. }