5

環境変数でオーバーライドしたい値をapplication.yaml含むファイルをgoアプリケーションに入れようとしています。${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://test:test@test:test/test

4

5 に答える 5

5

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
}

これにより、コレクションで見つかったすべてのプレースホルダーが上書きされます。

于 2018-10-12T10:27:47.973 に答える