gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:57:25 25 4
gpt4 key购买 nike

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

我们可以使用 Mixin 定义一个 bool 值 --stacktrace 选项,并将此 Mixin 包含在所有(子)命令中,或者使用继承并让所有命令子类化定义 bool 值 --stacktrace 选项,但无论哪种方式,都会为每个命令定义一个单独的 bool 选项。哪个选项为 true 取决于用户在参数中放置 --stacktrace 的位置,因此确定是否提供了 --stacktrace 意味着迭代所有父命令并查看是否提供任何一个都是正确的。

如果有一种更方便的方法来检测用户是否指定了这样的共享选项,那就太好了。

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

最佳答案

更新:使用 picocli 4.3 有两种方法可以实现此目的:


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

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:静态 bool 字段:

public static void main(String... args) {
assert Shared.stacktrace == false;

MyCommand myCommand = new MyCommand();
CommandLine.parseArgs(myCommand, "subcommand1", "--stacktrace");

assert Shared.stacktrace == true;
}

关于shell - Picocli:如何在父命令和子命令之间共享选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54207862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com