我正在使用 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)
})
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来隐藏某些命令的一些全局持久标志?
小智 7
例外情况应适用于例外情况。
您应该覆盖/设置您想要隐藏标志的命令的帮助功能,而不是根命令。通过这种方式,您可以将自定义逻辑与命令打包在一起,这将有助于维护它。
例子:
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)
Run Code Online (Sandbox Code Playgroud)
注意:这只是一个示例。您可能需要检查并处理任何错误。