如何解决Viper 将环境变量映射到结构成员
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
映射到 struct 成员,可能是因为我的托管服务提供商设置了 PORT
env 变量,我不能使用第二点,因为我想默认使用 yaml价值。
解决方法
您可以使用 viper.BindEnv(string...) error
将特定的环境变量绑定到配置。
来自Working with Environment Variables:
BindEnv 接受一个或多个参数。第一个参数是键名,其余是要绑定到这个键的环境变量的名称。如果提供了多个,它们将按指定的顺序优先。
这里端口的配置键是server.port
,环境变量PORT
应该绑定到它。
...
viper.AutomaticEnv()
err = viper.BindEnv("server.port","PORT")
if err != nil {
return
}
err = viper.ReadInConfig()
...
有了这个改变,像 PORT=9999 ./yourbinary
这样的调用会拿起 PORT
并将它写入 server.port
。从那里,它将被解组到您的结构中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。