如何将其他包中定义的标志合并到cobra.flags中



sig.k8s.io/controller-runtime/pkg/client/config/config.go:中的一些定义

var (
kubeconfig, apiServerURL string
)
func init() {
flag.StringVar(&kubeconfig, "kubeconfig", "",
"Paths to a kubeconfig. Only required if out-of-cluster.")
}

我的项目,mybinary,使用cobra

var rootCmd = &cobra.Command{
Use:   "mybinary",
Run: func(cmd *cobra.Command, args []string) {
somefunc()
}
}
func init() {
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file")
rootCmd.InitDefaultHelpFlag()
}

如果我想使用mybinary --kubeconfig somevalue设置在config.go上定义的参数kubeconfig,我需要做什么?

您有多种选择,但我认为目前最好的选择可能是使用cobra的PersistentPreRun函数:

var rootCmd = &cobra.Command{
// ...
PersistentPreRun: func(cmd *cobra.Command, args []string) {
flag.CommandLine.Parse([]string{"-kubeconfig", yourVariableHere})
},
// ...
}

也就是说,在运行根命令或从中派生的任何命令(前提是它们不覆盖PreRun(之前,您将调用相当于调用flag.Parse()的命令,就像有人运行过一样:

your-program -kubeconfig <string>

其中的值来自提供给您自己的Cobra标志的参数。如果正确的话,您可以使用cfgFile参数,或者添加--kubeconfig变量。

如果你使用的是viper,它似乎有自己的胶水来与基本的flag库混合,但我还没有对此进行研究。我确实在config.go中看到了这样的评论:

// TODO: Fix this to allow double vendoring this library but still register flags on behalf of users

如果固定的话,它将提供一种不同于呼叫flag.CommandLine.Parse的方式。

相关内容

  • 没有找到相关文章

最新更新