флаги с неработающей гадюкой и коброй: «флаг предоставлен, но не определен» - PullRequest
0 голосов
/ 21 апреля 2020
func init() {
    cobra.OnInitialize(initConfig)

    rootCmd.PersistentFlags().StringVarP(&loglevel, "loglevel", "l", "info", "Default log level")
    subCmd.Flags().StringVarP(&email, "email", "e", "", "the email")

    err := viper.BindPFlags(rootCmd.PersistentFlags())
    if err != nil {
        log.Warnf("binding main flag set failed : %v,", err)
    }
    err := viper.BindPFlags(subCmd.Flags())
    if err != nil {
        log.Warnf("binding main flag set failed : %v,", err)
    }
    rootCmd.AddCommand(subCmd)
}

, но при выполнении тестов с этим:

>$ go test -v -count 1 ./cli/cmd -run TestSub --loglevel debug
flag provided but not defined: -loglevel

Я нашел это: https://github.com/spf13/viper/issues/375

Возможно, этот код не работает из-за этого проблема, и я должен связать каждый флаг вручную, а не через установленный флаг?

Эта init функция определена в root.go, который находится в том же пакете, что и sub_test.go, который имеет func TestSub(t *testing.T)

РЕДАКТИРОВАТЬ: я пытался с одним вызовом привязки, но также происходит сбой: вместо вызова BindPFLags() я использовал: viper.BindPFlag("loglevel", rootCmd.PersistentFlags().Lookup("loglevel")

, и я все еще получаю «флаг предоставлен, но не определен» Должно быть что-то глупое, я не вижу

EDIT2 Это работает:

var testLoglevel = flag.String("loglevel", "debug", "verbosity of logs")

func init() {
    testing.Init()
    flag.Parse()
}

Я добавил это внутри моего sub_test.go.

Я все еще не понимаю, зачем это нужно, так как функция пакета init() (внутри root.go) также работает, и мы находимся в одном пакете, и я предполагаю, что viper flag.Parse() выполняет вызов BindPFlags() или что-то еще.

...