我在同时使用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 path
func 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)
中的添加命令)内,但是未填充该字段。我敢肯定我正确地遵循了眼镜蛇文档:https://github.com/spf13/cobra#create-rootcmd 最佳答案
将眼镜蛇标志绑定(bind)到vi蛇选项仅将眼镜蛇标志绑定(bind)到vi蛇选项,反之亦然。因此,您可以通过访问密码
pass := viper.GetString("password")
如果密码是通过毒蛇或眼镜蛇设置的,而不是通过标志定义中定义的变量设置的。
基本上,这里有两个选择:要么使用眼镜蛇而不将标志指向变量,然后通过对
viper.Get*
的各种调用来设置全局变量(甚至可以在使用它时对其进行清理),或者将viper用作„参数注册表”,并在需要时调用viper.Get*
。我倾向于采用前一种解决方案。关于go - 使用眼镜蛇/毒蛇麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59201122/