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

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

У меня есть команда listen с привязкой флага, и я хочу настроить ее в файле 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"

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

Как мне написать файл конфигурации, чтобы флаг был установлен правильно?


person Sascha    schedule 10.01.2017    source источник
comment
Извините, я не могу воспроизвести вашу проблему: я попытался использовать свой файл конфигурации yaml в / tmp и ваш код, и параметр привязки был правильно найден и установлен на его значение конфигурации. Однако я заметил, что параметр привязки не должен быть вложенным, чтобы его можно было найти, это так в вашей конфигурации?   -  person T. Claverie    schedule 11.01.2017
comment
@ T.Claverie У меня сейчас вторая версия (не вложенная). Я вставил его на pastebin.com/7TcqrdgV. Обновленный вопрос со ссылкой на полный источник   -  person Sascha    schedule 11.01.2017
comment
Возможный дубликат почему кобра не читает мой файл конфигурации   -  person WGH    schedule 07.07.2018
comment
@WGH для справки: этому 1 год 5 месяцев, другому 1 год 2 месяца, здесь нет необходимости голосовать за закрытие   -  person Sascha    schedule 09.07.2018
comment
@Sascha Я знаю, но другой вопрос немного более понятен, поскольку он включает проблемную часть - использование переменной, привязанной к pflag вместо viper.GetString() - и в этом вопросе есть только ссылка на репозиторий, в котором больше нет рассматриваемого кода.   -  person WGH    schedule 09.07.2018


Ответы (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"))

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

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

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

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

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

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

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

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

person T. Claverie    schedule 11.01.2017