我正在将眼镜蛇命令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
是我想在其他我不想重复相同标志的命令中使用的东西。
答案 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.IgnoreLatest
和opts.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, "")