Picocli: как разделить параметры между родительской командой и подкомандами - PullRequest
0 голосов
/ 16 января 2019

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

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

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

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

1 Ответ

0 голосов
/ 16 января 2019

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

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;
}
...