通用函数中的Golang眼镜蛇命令标志未从CLI获取值

时间:2019-10-24 14:16:11

标签: go command-line-interface go-cobra cobra

我正在将眼镜蛇命令flags移动到一个函数中,以便可以在其他命令中使用它。我可以看到命令,但是当键入标志时,它总是返回false

以下是我的代码:

func NewCommand(ctx context.Context) *cobra.Command {
    var opts ListOptions

    cmd := &cobra.Command{
        Use:   "list",
        Short: "List",
        RunE: func(cmd *cobra.Command, args []string) error {
            fmt.Println(args) // []
            opts.refs = args
            return List(ctx, gh, opts, os.Stdout)
        },
    }

    cmd = GetCommandFlags(cmd, opts)
    return cmd
}

// GetListCommandFlags for list
func GetCommandFlags(cmd *cobra.Command, opts ListOptions) *cobra.Command {
    flags := cmd.Flags()
    flags.BoolVar(&opts.IgnoreLatest, "ignore-latest", false, "Do not display latest")
    flags.BoolVar(&opts.IgnoreOld, "ignore-old", false, "Do not display old data")
    return cmd
}

所以当我键入以下命令

data-check list --ignore-latest

--ignore-latest的标志值应为true,但我在false args中得到RunE作为值。我在这里想念东西吗?

GetCommandFlags是我想在其他我不想重复相同标志的命令中使用的东西。

3 个答案:

答案 0 :(得分:1)

您正在按值将opts传递给GetCommandFlags。您应该传递一个指向它的指针,以便为标志注册的地址使用调用函数中声明的opts

func GetCommandFlags(cmd *cobra.Command, opts *ListOptions) *cobra.Command {
  ...
}

答案 1 :(得分:1)

您应使用func GetCommandFlags(cmd *cobra.Command, opts *ListOptions)并调用cmd = GetCommandFlags(cmd, &opts)之类的函数。

您可以打印opts.IgnoreLatestopts.IgnoreOld来查看更改后的值。

对我来说很好。希望它也对您有用。

func NewCommand(ctx context.Context) *cobra.Command {
    var opts ListOptions

    cmd := &cobra.Command{
        Use:   "list",
        Short: "List",
        RunE: func(cmd *cobra.Command, args []string) error {
            // fmt.Println(args) // []
            fmt.Println(opts.IgnoreLatest, ", ", opts.IgnoreOld)
            opts.refs = args
            return List(ctx, gh, opts, os.Stdout)
        },
    }

    cmd = GetCommandFlags(cmd, &opts)
    return cmd
}

// GetListCommandFlags for list
func GetCommandFlags(cmd *cobra.Command, opts *ListOptions) *cobra.Command {
    flags := cmd.Flags()
    flags.BoolVar(&opts.IgnoreLatest, "ignore-latest", false, "Do not display latest")
    flags.BoolVar(&opts.IgnoreOld, "ignore-old", false, "Do not display old data")
    return cmd
}

答案 2 :(得分:0)

您传递的是值参数,而不是指针参数。

尝试以下方式:

cmd = GetCommandFlags(cmd, &opts, "")