Флаги команды Golang Cobra в общей функции не получают значения из - PullRequest
0 голосов
/ 24 октября 2019

Я перемещаю свою команду кобры 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 как значение в RunE аргументах. Я что-то здесь упускаю?

GetCommandFlags - это то, что я хочу использовать в других командах, я не хочу повторять те же флаги.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Вы должны использовать 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
}
1 голос
/ 24 октября 2019

Вы передаете opts в GetCommandFlags по значению. Вы должны передать указатель на него, чтобы адреса, зарегистрированные для флагов, использовали opts, объявленный в вызывающей функции.

func GetCommandFlags(cmd *cobra.Command, opts *ListOptions) *cobra.Command {
  ...
}
0 голосов
/ 24 октября 2019

Вы передаете значение параметра, а не параметр указателя.

Попробуйте что-то вроде:

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