Picocli: как разделить параметры между родительской командой и подкомандами

Как поддерживать общие параметры для всех (или некоторых) команд и подкоманд? Например, если конечный пользователь предоставляет --stacktrace в любом месте аргументов командной строки любые напечатанные ошибки будут включать трассировку стека.

Мы можем использовать Mixin для определения логического --stacktrace и включите этот Mixin во все (под) команды, или используйте наследование, и пусть все команды наследуют класс, который определяет логическое значение --stacktrace опция, но в любом случае это определит отдельный логический параметр для каждой команды. Какой параметр является истинным, зависит от того, где в аргументах пользователь поставил --stacktraceтак что выяснить, если --stacktrace было предоставлено, будет означать итерации по всем родительским командам и посмотреть, если они верны.

Было бы неплохо иметь более удобный способ определения, указывал ли пользователь такой общий параметр.

(См. Также https://github.com/remkop/picocli/issues/580).

1 ответ

Один из способов сделать это - сделать логическое поле статическим:

class Shared {
    @Option(names = "--stacktrace")
    static boolean stacktrace;
}

Вам все равно придется либо создать подкласс, либо использовать миксин для определения этой опции в каждой команде и подкомандах:

@Command(subcommands = {Subcommand1.class, Subcommand2.class /*, ...*/}
class MyCommand {
    @Mixin
    Shared shared = new Shared();

    // ...
}

@Command(name = "subcommand1")
class Subcommand1 {
    @Mixin
    Shared shared = new Shared();

    // ...
}

Приятной особенностью этого дизайна является то, что теперь существует единственное место, где приложение может определить, задан ли конечный пользователь --stacktrace: статическое логическое поле:

public static void main(String... args) {
    assert Shared.stacktrace == false;

    MyCommand myCommand = new MyCommand();
    CommandLine.parseArgs(myCommand, "subcommand1", "--stacktrace");

    assert Shared.stacktrace == true;
}
Другие вопросы по тегам