gpt4 book ai didi

go - 使用 Cobra/Viper 遇到问题

转载 作者:行者123 更新时间:2023-12-03 18:38:11 26 4
gpt4 key购买 nike

我无法同时使用 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()
}

我正在尝试在我的子命令( log.Cmd(&options) 中添加的命令)中检索值 options.Password 但是该字段没有被填充。我很确定我正确地关注 Cobra 文档: https://github.com/spf13/cobra#create-rootcmd

最佳答案

将 cobra 标志绑定(bind)到 viper 选项只会将 cobra 标志绑定(bind)到 viper 选项,反之亦然。因此您可以通过以下方式访问密码

pass := viper.GetString("password")

如果密码是通过 viper 或 cobra 设置的,而不是通过标志定义中定义的变量。

基本上,你有两个选择:要么使用 cobra 而不将标志指向变量,然后通过对 viper.Get* 的各种调用来设置全局变量。 (您甚至可以在使用时对其进行 sanitizer ),或者您使用 viper 作为一种“参数注册表”并调用 viper.Get*需要的地方。我倾向于使用前一种解决方案。

关于go - 使用 Cobra/Viper 遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59201122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com