Go viper .yaml значения переменных окружения переопределяют - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь получить файл 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

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Обновление:

Я расширил собственный синтаксический анализатор yaml с помощью этой функциональности и выпустил его на github .

Использование:

type Config struct {
    Port     string   `yaml:"port"`
    RabbitMQ RabbitMQ `yaml:"rabbitmq"`
}

type RabbitMQ struct {
    Host     string `yaml:"host"`
    Port     string `yaml:"port"`
    Username string `yaml:"username"`
    Password string `yaml:"password"`
    Vhost    string `yaml:"vhost"`
}

func main() {
    var config Config
    file, err := ioutil.ReadFile("application.yaml")
    if err != nil {
        panic(err)
    }
    yaml.Unmarshal(file, &config)
    spew.Dump(config)
}

Вот так application.yaml выглядит следующим образом:

port: ${SERVER_PORT}
rabbitmq:
  host: ${RMQ_HOST}
  port: ${RMQ_PORT}
  username: ${RMQ_USERNAME}
  password: ${RMQ_PASSWORD}
  vhost: test

vhost значение будет проанализировано как обычно, в то время каквсе, что окружено "$ {" и "}", будет заменено переменными окружения.

0 голосов
/ 12 октября 2018

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(env) == 0 {
        panic("Mandatory env variable not found:" + env)
    }
    return res
}

Это перезапишет все заполнителинайдено в коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...