Конфиг файл с коброй и гадюкой

Основная информация: я создал приложение go и использовал для него Cobra. Cobra использует Viper для параметров командной строки и флагов.

У меня есть команда listen с флагом bind, и я хочу настроить ее в файле yaml.

Код:

Функция init команды listen выглядит следующим образом:

func init() {
    RootCmd.AddCommand(listenCmd)
    listenCmd.Flags().StringP("bind", "b", ":50051", "Provide bind definition")
    viper.BindPFlag("bind", listenCmd.Flags().Lookup("bind"))
}

Код моего заявления находится по адресу https://github.com/sascha-andres/go-logsink

Проблема:

Когда я вызываю приложение с listen --bind "bla" флаг установлен правильно bla, но я не нашел способ добиться этого с помощью файла YAML, расположенного в моем домашнем каталоге.

Конфиг файлы пробовал:

---

connect:
  bind: "bla"

а также

---

bind: "bla"

В обоих случаях файл конфигурации был найден, но флаг имел не ожидаемое значение, а значение по умолчанию.

Как мне написать конфигурационный файл для корректного заполнения флага?

1 ответ

Решение

Хорошо, спасибо за дополнительную информацию, это очень помогло!

проблема

Проблема возникает из-за того, как вы получаете значение флага. Вот что у вас есть:

bind := cmd.Flag("bind").Value.String()
fmt.Printf("Binding definition provided: %s\n", bind)
server.Listen(bind)

При связывании флага с viper, на самом деле это viper, который будет содержать окончательное значение в соответствии с этими приоритетами:

1. If present, use the flag value
2. Else, use the value from the config file
3. Else, use the default flag value

Ваша проблема в том, что вы извлекаете значение флага из набора флагов команды, а не из viper.

Поведение

Вот код, который я тестировал:

bind := cmd.Flag("bind").Value.String()
fmt.Printf("Binding definition provided: %s\n", bind)
fmt.Printf("Binding definition provided from viper: %s\n", viper.GetString("bind"))

Без параметра конфигурации bind:

$ go-logsink listen
Using config file: /xxx/.go-logsink.yaml
Binding definition provided: :50051
Binding definition provided from viper: :50051

Если для параметра конфигурации bind задано значение "bla" (не вложенный, второй файл конфигурации):

$ go-logsink listen
Using config file: /xxx/.go-logsink.yaml
Binding definition provided: :50051
Binding definition provided from viper: bla

Если для параметра конфигурации bind задано значение "bla" (не вложенный, второй файл конфигурации) и установлен явный флаг:

$ go-logsink listen --bind ":3333"
Using config file: /xxx/.go-logsink.yaml
Binding definition provided: :3333
Binding definition provided from viper: :3333

Итог: при связывании ваших флагов с помощью viper используйте viper, чтобы получить их.

Дополнительное примечание: в вашем README правильный способ генерировать grpc-совместимый код - добавить плагин grpc к генерации protobuf: protoc --go_out=plugins=grpc:. *.proto

Другие вопросы по тегам