Picocli: как сделать подкоманды обязательными

У меня есть команда с подкомандами. В моем приложении я хочу, чтобы пользователь обязательно указал подкоманду. Как мне это сделать?

(См. также https://github.com/remkop/picocli/issues/529< /а>)


person Remko Popma    schedule 29.10.2018    source источник


Ответы (1)


Обновление: теперь это задокументировано в руководстве по picocli: https://picocli.info/#_required_subcommands


До пикокли 4.3 для этого можно было показать ошибку или выдать ParameterException, если команда верхнего уровня вызывается без подкоманды.

Например:

    @Command(name = "top", subcommands = {Sub1.class, Sub2.class},
             synopsisSubcommandLabel = "COMMAND")
    class TopCommand implements Runnable {

        @Spec CommandSpec spec;

        public void run() {
            throw new ParameterException(spec.commandLine(), "Missing required subcommand");
        }

        public static void main(String[] args) {
            CommandLine.run(new TopCommand(), args);
        }
    }

    @Command(name = "sub1)
    class Sub1 implements Runnable {
        public void run() {
            System.out.println("All good, executing Sub1");
        }
    }

    @Command(name = "sub2)
    class Sub2 implements Runnable {
        public void run() {
            System.out.println("All good, executing Sub2");
        }
    }

Начиная с picocli 4.3, это можно сделать проще, сделав команду верхнего уровня не реализовывать Runnable или Callable.

Если команда имеет подкоманды, но не реализует Runnable или Callable, picocli сделает подкоманды обязательными.

Например:

@Command(name = "top", subcommands = {Sub1.class, Sub2.class},
         synopsisSubcommandLabel = "COMMAND")
class TopCommand {
    public static void main(String[] args) {
        CommandLine.run(new TopCommand(), args);
    }
}
person Remko Popma    schedule 29.10.2018
comment
Как правильно заметил @david-wikler, автоматически сгенерированный синопсис в сообщении справки об использовании по-прежнему будет показывать команду как необязательную в скобках [ и ], поэтому это не идеальное решение. Обойти это можно, предоставив собственный синопсис. Подробнее см. на picocli.info/#_custom_synopsis. - person Remko Popma; 09.12.2018
comment
Как это решение помогает, если вы действительно хотите, чтобы ваш TopCommand работал? Например, чтобы получить параметры команды, применимые ко всем подкомандам? Это решение, по-видимому, обходит основные команды для получения параметров? - person taftster; 28.02.2019
comment
Чтобы позволить вашим подкомандам получить доступ к параметрам из команды верхнего уровня, вам на самом деле не нужно run свою команду верхнего уровня. Вместо этого вы, вероятно, захотите использовать аннотацию @ParentCommand. См. пример в руководстве пользователя: picocli.info/#__code_parentcommand_code_annotation - person Remko Popma; 28.02.2019