【发布时间】:2021-01-16 06:03:55
【问题描述】:
这是我的config.yaml 文件
server:
port: 5000
这是我使用 viper 解组的逻辑
type Configurations struct {
Server ServerConfig
}
type ServerConfig struct {
Port int
}
// LoadConfig reads configuration from file or environment variables.
func LoadConfig(path string) (config Configurations, err error) {
viper.AddConfigPath(path)
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AutomaticEnv()
err = viper.ReadInConfig()
if err != nil {
return
}
err = viper.Unmarshal(&config)
return
}
我已经设置了环境变量export PORT=9000,现在我的问题是如何将环境变量PORT 映射到Configurations.ServerConfig.Port。
我想为 dev 提供具有默认值的配置文件,并希望我的应用程序从生产环境变量中读取/覆盖配置,我如何使用 viper 来实现这一点。
我看到以下选项
- 设置
SERVER_PORT,然后使用如下替换器将其解组为结构
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
但我想将变量 PORT 映射到结构成员,可能是因为我的托管服务提供商设置了 PORT env 变量,而我不能使用第二点,因为我希望使用 yaml 作为默认值。
【问题讨论】:
-
为什么你没有为你的字段设置
yaml:"server"和yaml:"port",然后设置SERVER_PORTevn? -
正如我的托管服务提供商设置的问题中所述。 PORT 默认情况下,我不能覆盖所以
SERVER_PORT不是一个选项。我也想探索如何绑定它。