2

中的一些定义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来设置参数kubeconfig定义,我需要做什么config.go

4

1 回答 1

0

您有多种选择,但我认为目前您最好的选择可能是使用 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.

于 2020-09-24T00:53:19.843 回答