我试图在go应用程序中有一个application.yaml
文件,其中包含我想用环境变量覆盖的${RMQ_HOST}
值。
在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://测试:在${RMQ主机}:${RMQ端口}/测试时进行测试
代替
amqp://测试:测试@测试:测试/测试
6条答案
按热度按时间jvlzgdj91#
Viper不能为键/值对中的值保留占位符,因此我使用以下代码片段解决了这个问题:
这将覆盖集合中找到的所有占位符。
webghufk2#
更新日期:
我用这个功能扩展了原生的yaml解析器,并在github上发布了它。
用法:
下面是application.yaml的外观:
7qhs6swi3#
您可以在调用“Unmarshal”方法之前显式替换env变量。假设配置存储在“Config”变量中,则以下代码片段应该可以工作。
bq3bfh9z4#
我首先用
regexp
代替ENV解决了类似的问题,下面是我的解决方案:和主星,开始:
和我的输出:
dgiusagp5#
我认为更好的方法是在将配置解码为结构体时使用Viper的 DecodeHooks 概念:
如果您有一个如下所示的 yaml 配置文件:
然后在decode挂接内,在解码发生时获取ENV变量:
我认为这可以进一步改进,因为你可能有一个传入的属性,可能需要设置为一个int,例如。
tnkciper6#
可能不是直接的答案,但你试图解决的问题的解决方案。
很有可能你不需要替换。如果你把yml中的键保留为空,并打开
viper.AutomaticEnv()
,那么它会从环境变量中选取这些值。你还需要添加一个替换器来匹配键和环境变量名,比如:现在,当您取消marhsal配置时,您将从env中获得缺少的密钥。
例如:
RABBITMQ_PASSWORD
env变量将被用来设置rabbitmq.password
,如果你的yml看起来像这样: