Конфиг файл с коброй и гадюкой
Основная информация: я создал приложение 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