登录
首页 >  Golang >  Go问答

Viper 在环境变量中覆盖 .yaml 文件中的值

来源:stackoverflow

时间:2024-03-21 23:09:33 360浏览 收藏

在 Go 应用程序中使用 Viper 库加载 `application.yaml` 文件时,如何使用环境变量覆盖文件中的 `${rmq_host}` 值。虽然 Viper 可以自动加载环境变量,但它无法保留键/值对中的占位符。为了解决此问题,文章介绍了一种代码片段,通过遍历所有键并使用 `getEnvOrPanic` 函数替换环境变量中的占位符,从而覆盖所有占位符。

问题内容

我正在尝试在 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://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
}

这将覆盖集合中找到的所有占位符。

终于介绍完啦!小伙伴们,这篇关于《Viper 在环境变量中覆盖 .yaml 文件中的值》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>