Picocli:如何在父命令和子命令之间共享选项

时间:2019-01-15 22:37:50

标签: shell command-line command picocli

如何在所有(或某些)命令和子命令中支持共享选项?例如,如果最终用户在命令行参数中的任何位置提供--stacktrace,则打印的任何错误都将包括堆栈跟踪。

我们可以使用Mixin定义布尔--stacktrace选项,并将此Mixin包括在所有(子)命令中,或者使用继承并让所有命令对定义布尔--stacktrace选项的类进行子类化,但是无论哪种方式,都会为每个命令定义一个单独的布尔选项。哪个选项是正确的取决于用户将--stacktrace放在参数中的位置,因此弄清楚是否提供了--stacktrace意味着要遍历所有父命令并查看是否为真。

最好有一种更方便的方法来检测用户是否指定了这种共享选项。

(另请参见https://github.com/remkop/picocli/issues/580

1 个答案:

答案 0 :(得分:0)

一种实现此目的的方法是使布尔字段为静态:

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