如何支持所有(或部分)命令和子命令的共享选项?例如,如果最终用户在命令行参数中的任何位置提供--stacktrace
,则打印的任何错误都将包含堆栈跟踪。
来定义布尔--stacktrace
选项,并将此 Mixin 包含在所有(子)命令中,或者使用继承并让所有命令子类化定义布尔--stacktrace
选项的类,但无论哪种方式,这将为每个命令定义一个单独的布尔选项。哪个选项是正确的取决于用户在参数中放置--stacktrace
的位置,因此确定是否提供了--stacktrace
将意味着遍历所有父命令并查看是否有任何父命令为真。
最好有一种更方便的方法来检测用户是否指定了这样的共享选项。
(另见 https://github.com/remkop/picocli/issues/580)
更新:在 picocli 4.3 中,有两种方法可以实现此目的:
- 继承的选项
- let 子命令使用委托给父命令的 mixin(因此选项修改的状态位于一个位置)
实现
此目的的一种方法是使布尔字段静态:
class Shared {
@Option(names = "--stacktrace")
static boolean stacktrace;
}
您仍然需要子类或使用 mixin 在每个命令和子命令中定义此选项:
@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;
}