【问题标题】:Determine if flags were actually passed in (sub)command invocation in golang's cobra/viper确定标志是否在 golang 的 cobra/viper 中的(子)命令调用中实际传递
【发布时间】:2021-11-23 14:29:15
【问题描述】:

我有一个cobra 命令

var mycommandCmd = &cobra.Command{
    Use:   "mycommand",
    PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
        viper.BindPFlags(cmd.Flags())

和一个子命令

var mysubcommandCmd = &cobra.Command{
    Use:   "mysubcommand",
    Args:  cobra.ExactArgs(1),
    RunE: func(cmd *cobra.Command, args []string) error {
        viper.BindPFlags(cmd.Flags())

我当然是绑定在一起的

mycommandCmd.AddCommand(mysubcommandCmd)

我也有他们两个的标志

mycommandCmd.PersistentFlags().BoolP("foo", "", true, "Whether to foo")
mysubcommandCmd.Flags().BoolP("foobar", "", true,  "Whether to foobar")

我的问题如下:

假设结束 go 二进制文件被命名为 prog,是否有一个 (cobra / viper) 内置方法来检查在子命令调用期间是否实际传递了任何标志?

即我如何以编程方式区分这个

prog mycommand mysubcommand --foobar

还有这个

prog mycommand mysubcommand

检查默认标志值当然不会起作用(并且不会根据标志编号进行缩放)

【问题讨论】:

    标签: go flags viper-go cobra


    【解决方案1】:

    你可以这样做:

    isSet:=cmd.Flags().Lookup("foobar").Changed
    

    如果设置了标志,或者使用了默认值,则应该返回。

    【讨论】:

    • 所以为了让我检查是否确实设置了 NONE,必须对所有标志逐一进行,对吗?
    • 对于布尔值,是的。对于字符串,你可以给一个空的默认值并检查它是否为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多