如何将某些 Cobra 命令的某些全局持久标志标记为隐藏



我正在使用Cobra开发一些CLI实用程序。对于我的RootCmd,我已经设置了一些持久标志(即也影响所有命令的标志)。但是有些命令不使用这些标志,所以我想为这些特定命令隐藏它们,这样这些标志就不会与myutil help mycmdmyutil 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)
    })
}

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

例外应应用于例外情况。

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

例:

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)

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

就我而言,我有 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
}

相关内容

  • 没有找到相关文章

最新更新