我正在努力拥有application.yaml
go 应用程序中的文件包含${RMQ_HOST}
我想用环境变量覆盖的值。
In application.yaml
我有:
rmq:
test:
host: ${RMQ_HOST}
port: ${RMQ_PORT}
在我的装载机中我有:
log.Println("Loading config...")
viper.SetConfigName("application")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
viper.AutomaticEnv()
err := viper.ReadInConfig()
我遇到的问题是${RMQ_HOST}
不会被我在环境变量中设置的值替换,并尝试使用此字符串连接到 RabbitMQ
amqp://test:test@${RMQ_HOST}:${RMQ_PORT}/test
代替
amqp://测试:测试@测试:测试/测试
Viper 无法在键/值对中保留值的占位符,因此我设法用以下代码片段解决了我的问题:
log.Println("Loading config...")
viper.SetConfigName("application")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
panic("Couldn't load configuration, cannot start. Terminating. Error: " + err.Error())
}
log.Println("Config loaded successfully...")
log.Println("Getting environment variables...")
for _, k := range viper.AllKeys() {
value := viper.GetString(k)
if strings.HasPrefix(value, "${") && strings.HasSuffix(value, "}") {
viper.Set(k, getEnvOrPanic(strings.TrimSuffix(strings.TrimPrefix(value,"${"), "}")))
}
}
func getEnvOrPanic(env string) string {
res := os.Getenv(env)
if len(res) == 0 {
panic("Mandatory env variable not found:" + env)
}
return res
}
这将覆盖集合中找到的所有占位符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)