7

我正在用 Cobra 开发一些 CLI 实用程序。对于我来说RootCmd,我设置了一些持久性标志(即也影响所有命令的标志)。但是有些命令不使用这些标志,所以我想让它们对这些特定命令隐藏,这样这些标志就不会用myutil help mycmdor显示myutil mycmd --help

下面的代码片段完成了这项工作,但对我来说它有点难看而且很难维护:

func init() {
    RootCmd.PersistentFlags().StringVar(&someVar, "some-flag", "", "Nothing to see here, move along.")

    origHelpFunc := TidalCmd.HelpFunc()
    RootCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
        if cmd.Name() == "no-flags-cmd" || (cmd.Parent() != nil && cmd.Parent().Name() == "no-flags-cmd") {
            cmd.Flags().MarkHidden("some-flag")
        }
        origHelpFunc(cmd, args)
    })
}

有没有更好的方法来隐藏某些命令的一些全局持久标志?

4

2 回答 2

2

例外情况应适用于例外情况。

您应该覆盖/设置您希望隐藏标志的命令的帮助功能,而不是您的根命令。这样,您可以将自定义逻辑与您的命令打包在一起,这将有助于维护它。

例子:

mySubCommand := &cobra.Command{
    Use:   "no-flags-cmd [command]",
    Short: "Takes no flags for an argument",
    RunE: func(cmd *cobra.Command, args []string) error {
        return nil
    },
}

mySubCommand.SetHelpFunc(func(command *cobra.Command, strings []string) {
   // Hide flag for this command
   command.Flags().MarkHidden("some-flag")
   // Call parent help func
    command.Parent().HelpFunc()(command, strings)
})

rootCmd.AddCommand(mySubCommand)

注意:这只是一个例子。您可能需要检查和处理任何错误。

于 2021-11-02T16:14:04.400 回答
0

就我而言,我有 30 个全局标志,所以我必须创建一个辅助函数来传递不应隐藏的标志

import (
    "github.com/spf13/cobra"
    "github.com/spf13/pflag"
)


var parentCmd = &cobra.Command{}
var subCommand= &cobra.Command{}

func init(){
    subCommand.SetHelpFunc(func(command *cobra.Command, strings []string) {
        markGlobalFlagsHiddenExcept(parentCmd,"unide-this","unhide-this-too")
        command.Parent().HelpFunc()(command, strings)
    })

    parentCmd.AddCommand(subCommand)
}


func markGlobalFlagsHiddenExcept(command *cobra.Command, unhidden ...string) {
    command.PersistentFlags().VisitAll(func(flag *pflag.Flag) {
        name := flag.Name
        if !contains(unhidden, name) {
            flag.Hidden = true
        }
    })
}

// contains returns true if the string is in the slice
func contains(b []string, i string) bool {
    for _, s := range b {
        if s == i {
            return true
        }
    }
    return false
}
于 2021-12-28T08:14:36.677 回答