config.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package config
  2. import (
  3. "fmt"
  4. "github.com/spf13/viper"
  5. )
  6. type Config struct {
  7. AppEnv string
  8. AppPort string
  9. RedisAddr string
  10. MySQLDSN string
  11. PostgresDSN string
  12. MongoDSN string
  13. }
  14. // 需先执行LoadConfig后才能读取APP_ENV
  15. var APP_ENV string
  16. // LoadConfig 读取配置文件和环境变量
  17. func LoadConfig() (*Config, error) {
  18. v := viper.New()
  19. // 默认值(避免缺省时崩溃)
  20. v.SetDefault("APP_ENV", "dev")
  21. v.SetDefault("APP_PORT", "8080")
  22. v.SetDefault("REDIS_ADDR", "localhost:6379")
  23. v.SetDefault("MYSQL_DSN", "")
  24. v.SetDefault("POSTGRES_DSN", "host=localhost user=fwh_toolbox password=fwh_toolbox dbname=fwh_toolbox_db port=5432 sslmode=disable")
  25. v.SetDefault("MONGO_DSN", "mongodb://localhost:27017/FwhToolboxDbDev")
  26. // 多文件路径支持
  27. paths := []string{"./.env", "./config.env"}
  28. var readErr error
  29. for _, path := range paths {
  30. v.SetConfigFile(path)
  31. if err := v.ReadInConfig(); err == nil {
  32. fmt.Printf("✅ Using config file: %s\n", path)
  33. readErr = nil
  34. break
  35. } else {
  36. readErr = err
  37. }
  38. }
  39. // 环境变量覆盖文件配置
  40. v.AutomaticEnv()
  41. // 如果两个文件都没读到,也没关系,直接用默认值
  42. if readErr != nil {
  43. fmt.Println("⚠️ No config file found, using default values & environment variables")
  44. }
  45. APP_ENV = v.GetString("APP_ENV")
  46. return &Config{
  47. AppEnv: v.GetString("APP_ENV"),
  48. AppPort: v.GetString("APP_PORT"),
  49. RedisAddr: v.GetString("REDIS_ADDR"),
  50. MySQLDSN: v.GetString("MYSQL_DSN"),
  51. PostgresDSN: v.GetString("POSTGRES_DSN"),
  52. MongoDSN: v.GetString("MONGO_DSN"),
  53. }, nil
  54. }