我无法同时使用 Cobra 和 Viper。这就是我正在做的事情:var options util.Config = util.Config{}var rootCmd = &cobra.Command{ Use: "test [command] [subcommands]", Run: func(cmd *cobra.Command, args []string) { if err := server.Run(); err != nil { l.Fatal(err) } },}// initConfig helps initialise configuration with a stated pathfunc initConfig() { if options.Path != "" { viper.SetConfigFile(options.Path) } viper.AutomaticEnv() if err := viper.ReadInConfig(); err != nil { fmt.Println("Could not use config file: ", viper.ConfigFileUsed()) }}func init() { cobra.OnInitialize(initConfig) rootCmd.PersistentFlags().StringVarP(&options.Path, "config", "n", "", "Path of a configuration file") rootCmd.PersistentFlags().StringVarP(&options.Password, "password", "d", "", "Password to access the server") viper.BindPFlag("password", rootCmd.PersistentFlags().Lookup("password")) rootCmd.AddCommand(log.Cmd(&options))}func main() { rootCmd.Execute()}我正在尝试在我的子命令中检索值 options.Password (在 中添加的命令log.Cmd(&options))但是该字段没有被填充。我很确定我正确地关注 Cobra 文档:https ://github.com/spf13/cobra#create-rootcmd
1 回答
www说
TA贡献1775条经验 获得超8个赞
将 cobra 标志绑定到 viper 选项只会将 cobra 标志绑定到 viper 选项,反之亦然。因此您可以通过以下方式访问密码
pass := viper.GetString("password")
如果密码是通过 viper 或 cobra 设置的,而不是通过标志定义中定义的变量。
基本上,你有两个选择:要么使用 cobra 而不将标志指向变量,然后通过各种调用设置全局变量viper.Get*
(你甚至可以在处理它们时对其进行清理),或者使用 viper 作为“参数”注册表”并viper.Get*
在需要的地方调用。我倾向于使用前一种解决方案。
- 1 回答
- 0 关注
- 162 浏览
添加回答
举报
0/150
提交
取消