Запрос об использовании FlagSet

Я пытаюсь создать CLI, в котором я ожидаю, что группа из трех аргументов появится вместе.

command --alpha "value-a" --bravo "value-b" --charlie "value-c"

Вот как я пытаюсь это сделать:

import (
    "github.com/spf13/pflag"
)

var (
    alpha         string
    bravo         string
    charlie       string
)

abcFlagSet := pflag.NewFlagSet("alpha", pflag.ContinueOnError)
abcFlagSet.StringVar(&bravo, "bravo", "", "bravo-description")
abcFlagSet.StringVar(&charlie, "charlie", "", "charlie-description")
cmd.Flags().AddFlagSet(abcFlagSet)

Это правильно распознает флаги bravo и charlie. Однако я думаю, что он обрабатывает alpha как подкоманду command и не анализирует присвоенное ей значение, то есть value-a. Является ли FlagSet неправильным использованием для этого варианта использования? Как мне разобрать этот сценарий, в котором три аргумента могут появляться все вместе или вообще не появляться?


person gonn00b    schedule 12.09.2018    source источник
comment
На заметку: подумайте о том, чтобы проверить альтернативную библиотеку CLI с первоклассной поддержкой подкоманд, если вы можете себе это позволить. По моему опыту, mov.cli значительно эффективнее и проще в использовании в сложных случаях (несколько уровней подкоманд и т. д.): github.com/jawher/mow.cli).   -  person oakad    schedule 12.09.2018
comment
@oakad по вопросу, это именно то, что OP не пытается сделать.   -  person Adrian    schedule 12.09.2018


Ответы (1)


https://github.com/spf13/pflag/blob/298182f68c66c05229eb03ac171abe6e309ee79a/flag.go#L1202-L1213, как сказано здесь, вы формируете FlagSet с именем alpha. Очевидно, ваш код не считает это флагом. Правильный способ определить новый флаг с именем alpha будет следующим:

abcFlagSet.StringVar(&alpha, "alpha", "", "alpha-description").

person whitespace    schedule 12.09.2018
comment
Спасибо за ответ. Причина, по которой я использовал FlagSet, заключается в надежде, что библиотека pflag обеспечит, чтобы все флаги в FlagSet отображались вместе. То, что вы предложили, определенно работает. Но обеспечение того, чтобы все три отображались вместе, будет обязанностью моего кода, верно? - person gonn00b; 12.09.2018
comment
Нет, использование FlagSet не гарантирует установку всех флагов. Это гарантирует, что у вас есть группа флагов, которые имеют общую функцию ошибок и правило сортировки. Если вы хотите проверить, установлены ли все флаги, вы можете использовать функцию «VisitAll». Ваша функция может установить некоторую карту или фрагмент для каждого флага, а затем, проверив длину этого фрагмента или значение (я) карты, вы можете проверить, установлены ли все флаги. - person whitespace; 12.09.2018
comment
Однако это довольно нестандартное использование флагов; похоже, что вам действительно нужны аргументы командной строки, а не флаги. Флаги обычно используются для опций, а не для обязательных аргументов. - person Adrian; 12.09.2018