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

au9on6nz  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(110)

如何支持所有(或部分)命令和子命令的共享选项?例如,如果最终用户在命令行参数中的任何位置提供--stacktrace,则打印的任何错误都将包括堆栈跟踪。
我们可以使用Mixin定义一个布尔值--stacktrace选项,并将此Mixin包含在所有(sub)命令,或者使用继承并让所有命令子类化一个定义boolean --stacktrace选项的类,但无论哪种方式,都将为每个命令定义一个单独的boolean选项。哪个选项为真取决于用户将--stacktrace放在args中的位置,因此,要弄清楚是否提供了--stacktrace意味着要迭代所有父命令,并查看是否有任何为真。
如果有一种更方便的方法来检测用户是否指定了这样一个共享选项,那就太好了。

k4emjkb1

k4emjkb11#

更新:在Picocli 4.3中,有两种方法可以实现这一点:

  • 继承期权
  • 让子命令使用一个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;
}

相关问题