7

Cobra と Viper のドキュメントは私を混乱させます。私はやったcobra init fooprojectし、プロジェクトディレクトリ内でやったcobra add bar. PersistentFlag名前の付いた があり、これがコマンドfooの init 関数です。root

func Execute() {
    if err := RootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(-1)
    }

    fmt.Println(cfgFile)
    fmt.Println("fooString is: ", fooString)
}


func init() {
    cobra.OnInitialize(initConfig)

    // Here you will define your flags and configuration settings.
    // Cobra supports Persistent Flags, which, if defined here,
    // will be global for your application.

    RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.fooproject.yaml)")
    RootCmd.PersistentFlags().StringVar(&fooString, "foo", "", "loaded from config")

    viper.BindPFlag("foo", RootCmd.PersistentFlags().Lookup("foo"))
    // Cobra also supports local flags, which will only run
    // when this action is called directly.
    RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

私の設定ファイルは次のようになります...

---
foo: aFooString

そして、電話するgo run main.goと、これが表示されます...

A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.

Usage:
  fooproject [command]

Available Commands:
  bar         A brief description of your command
  help        Help about any command

Flags:
      --config string   config file (default is $HOME/.fooproject.yaml)
      --foo string      loaded from config
  -h, --help            help for fooproject
  -t, --toggle          Help message for toggle

Use "fooproject [command] --help" for more information about a command.

fooString is:

電話しgo run main.go barたら、これ見て…

Using config file: my/gopath/github.com/user/fooproject/.fooproject.yaml
bar called

fooString is:

したがって、構成ファイルを使用していますが、どちらもそれを読み取っていないようです。コブラとバイパーの仕組みを誤解しているのかもしれません。何か案は?

4

4 に答える 4

4

同じ問題に直面している人にとって、問題は次の通話にあります。

cobra.OnInitialize(initConfig)

関数 initConfig は直接実行されませんが、初期化子の配列に追加されますhttps://github.com/spf13/cobra/blob/master/cobra.go#L80

したがって、Runフィールドが実行されると、構成ファイルに保存されている値がロードされます。

  rootCmd = &cobra.Command{
    Use:   "example",
    Short: "example cmd",
    Run: func(cmd *cobra.Command, args []string) { // OnInitialize is called first
      fmt.Println(viper.AllKeys())
    },  
  }
于 2020-03-24T21:45:59.767 に答える