这是我的config.yaml
文件
server:
port: 5000
这是我用毒蛇解封的逻辑
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
}
我已经设置了env变量export PORT=9000
,现在我的问题是如何将环境变量PORT
映射到Configurations.ServerConfig.Port
。我希望配置文件中的dev默认值,并希望我的应用程序在生产中从env变量中读取/覆盖配置,如何使用viper实现这一点。
我看到以下选项
SERVER_PORT
,然后使用下面这样的替换器将其解封为structreplacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
但是,我想将变量PORT
映射到struct成员,可能是因为我的宿主服务提供商设置了PORT
env变量,而且我不能使用第二点,因为我希望使用yaml作为默认值。
发布于 2021-01-16 06:40:07
可以使用viper.BindEnv(string...) error
将特定的环境变量绑定到配置。
来自使用环境变量
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
中。从那里开始,它将被解压缩到您的结构中。
https://stackoverflow.com/questions/65746929
复制相似问题