我创建了一个cobra命令并添加了一个标志:
cmd.Flags().StringVarP(&primaryIP, "primary-ip", "p", "", "Help text")
除了自己检查值并返回错误之外,是否有一种方法可以使其必需?
几个月前,这种行为在cobra
中被更改,尽管文档对此不是很清楚。现在,如果您将一个标志标记为MarkFlagRequired("primary-ip")
,并且您没有提供这样的标志,那么运行该命令将打印help +
required flag(s) "primary-ip"
exit status 1
晚了,但我希望这对你有帮助!
首先,我们需要知道cobra
定义了两种类型的标志。
持久标志:它们将对命令及其下的每个子命令可用。
本地标志:它们只对定义它们的特定命令可用。
因此,cobra
提供了两种方法来根据标志的类型生成所需的标志。
在命令的init
函数上,它可以是root
或任何其他命令或子命令。让我们创建一个名为my-cmd
的cli应用程序,并使用名为xD sub-command
// root.go file
var Foo bool
func init() {
cobra.OnInitialize(initConfig)
// define required persistent flag
myCmd.PersistentFlags().BoolVarP(&Foo, "foo", "f", false, "set foo (*)")
myCmd.MarkPersistentFlagRequired("foo")
}
// subCommand.go file
var Bar string
func init() {
// just add subCmd as a sub-command of my-cmd
myCmd.AddCommand(subCmd)
// define required local flag
subCmd.Flags().StringVarP(&Bar, "bar", "b", "", "set bar (*)")
subCmd.MarkFlagRequired("bar")
}
当你在CLI中调用命令时
# if you don't pass a value for 'foo' flag
> my-cmd
required flag(s) "foo" not set
exit status 1
# here you must pass a value for 'foo' because is persistent as well as 'bar' because is local for sub-cmd
> my-cmd sub-cmd
required flag(s) "foo", "bar" not set
exit status 1
不,你必须自己检查你的程序输入是否正确。
注意,这是有意义的,因为您可能希望同时检查输入是否正确。在您的示例中,您应该检查输入是否存在,以及输入是否为有效的ip地址。
cmd.Flags().StringVarP(&var, "var", "r", "", "")
cmd.MarkFlagRequired("var")