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