Picocli: можно ли настроить парсер с помощью аннотаций? - PullRequest
1 голос
/ 23 мая 2019

Я использую PicoCLI для разбора аргументов.Мне нужно указать setStopAtPositional(true) для одной из подкоманд.Есть ли способ сделать это с аннотацией?В настоящее время я делаю это:

cmd.getSubcommands().get("submit").setStopAtPositional(true);

Но было бы лучше указать это в методе, в котором указана команда submit, чтобы иметь всю спецификацию в одном месте.

Мой класс имеет такую ​​структуру:

@Command(...)
public class CommandLine implements Callable<Void> {

    @Command(...)
    public void submit( ... options) {
    }
}

1 Ответ

1 голос
/ 24 мая 2019

Picocli допускает различную конфигурацию парсера для каждой подкоманды, и то, что вы предлагаете, работает для вашего примера.

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

Обратите внимание, что настройка конфигурации анализатора с помощью объекта CommandLine изменит ее для этой команды и ее полной иерархии подкоманд и подкоманд.

Если вы хотите изменить конфигурацию синтаксического анализатора для команды single (без влияния на ее подкоманды), используйте CommandLine.getCommandSpec().parser(), чтобы получить объект ParserSpec и выполнить настройкуна этом ParserSpec объекте (пример ниже).

Вопрос не упоминал об этом, но может возникнуть проблема, что в picocli 3.9.x немного неуклюже вызывать программу после настройки с помощью parseWithHandler метод.Это становится немного лучше с методом execute, добавленным в picocli 4.0.

Например:

@Command(subcommands = B.class)
class A implements Callable<Integer> {
}

@Command(name = "B")
class B implements Callable<Integer> {

    @Command
    public int subB(... options) {
    }
}

public static void main(String... args) {
    CommandLine cmdA = new CommandLine(new A());

    // Example 1: configure the B command _and_ its subcommands
    cmdA.getSubcommands().get("B").setStopAtPositional(true);

    // Example 2: configure the A command _only_ (not the subcommands)
    cmdA.getCommandSpec().parser().caseInsensitiveEnumValuesAllowed(true);

    // parse input and run the command
    int exitCode = cmdA.execute(args);
    System.exit(exitCode);
}
...