我正在使用Cobra开发一些CLI实用程序。对于我的RootCmd
,我已经设置了一些持久标志(即也影响所有命令的标志)。但是有些命令不使用这些标志,所以我想为这些特定命令隐藏它们,这样这些标志就不会与myutil help mycmd
或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)
})
}
有没有更好的方法来隐藏某些命令的一些全局持久标志?
例外应应用于例外情况。
您应该覆盖/设置您希望隐藏标志的命令的帮助函数,而不是您的根命令。这样,您可以将自定义逻辑与命令打包在一起,这将有助于维护它。
例:
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
}