在List<>
中使用@ArgGroup
选项时,在简短用法帮助中它是重复的。考虑以下代码:
import picocli.CommandLine;
import picocli.CommandLine.*;
import picocli.CommandLine.Model.CommandSpec;
@Command(name = "MyApp")
public class App implements Runnable {
@ArgGroup(exclusive=true) // or false
MyGroup myGroup;
static class MyGroup {
@Option(names="-A", paramLabel="N", split=",") List<Long> A;
}
@Spec CommandSpec spec;
@Override
public void run() {
System.out.printf("OK: %s%n", spec.commandLine().getParseResult().originalArgs());
}
public static void main(String[] args) {
new CommandLine(new App()).execute("-h");
}
}
显示以下输出
Usage: MyApp [[-A=N[,N...]] [-A=N[,N...]]...]
我期待输出
Usage: MyApp [-A=N[,N...]]
出于其他原因,代码中还需要 @ArgGroup
,在这个玩具示例中,它似乎是徒劳的。
答案 0 :(得分:1)
您可能在picocli中发现了一个错误。 您介意在picocli issue tracker上提出这一点吗?
更新:
这是一个错误。在下一版的picocli中,可以通过将参数组设置为exclusive = false
来实现预期的提要。
这些概要的内容可能会变得非常复杂...让我们对其进行分解。
在进入参数组之前,我们首先来看一下简单的选项。 Picocli对必需和非必需选项以及单值和多值选项显示了不同的提要。
下表说明。请特别注意必需的多值选项的符号。必须至少一次(但可能多次)指定这些选项,并且提要反映了这一点:
Required Non-Required
--------- ------------
Single value -x=N [-x=N]
Multi-value -x=N [-x=N]... [-x=N]...
现在,让我们看一下分组。在exclusive
组(默认)中,所有参数均自动设置为required
。 (这背后有一段历史,但基本上其他任何事情都没有道理。)在非排他性的组中,选项可以是必需的或可选的。
组有一个multiplicity
。默认值为multiplicity = "0..1"
,表示该组是可选的,在大纲中以[
和]
方括号将其括起来。
现在,让我们将它们放在一起。下表显示了带有两个选项-x
和-y
的组的简介:
Exclusive Group Non-Exclusive Group
--------------------------------- -------------------
Single value [-x=N | -y=M] [[-x=N] [-y=M]]
Multi-value [-x=N [-x=N]... | -y=M [-y=M]...] [[-x=N]... [-y=M]...]
在最后一个元件:当所述选项接受split=","
的正则表达式,所述N
参数标签变为N[,N...]
在概要
当我使用picocli 4.3.2执行您的示例时,我得到以下摘要:
Usage: MyApp [[-A=N[,N...]] [-A=N[,N...]]...]
这是错误的,不符合上述规范。
使用picocli 4.3.3-SNAPSHOT,我得到了正确的提要:
Usage: MyApp [-A=N[,N...] [-A=N[,N...]]...]
鉴于以上所述,我们现在知道原因:这是排他组上多值选项的摘要。该选项成为required
选项,因为该组是互斥的。
对于picocli 4.3.3,一个想法是使组成为非排他性的(毕竟,只有一种选择,排他性或非排他性无关紧要)。该程序几乎未更改(从exclusive = false
到true
):
@Command(name = "MyApp")
public class App implements Runnable {
@ArgGroup(exclusive = false) // was: exclusive=true
MyGroup myGroup;
static class MyGroup {
@Option(names="-A", paramLabel="N", split=",")
List<Long> A;
}
// ...
}
用法帮助消息的提要现在看起来像这样:
Usage: MyApp [[-A=N[,N...]]...]
我希望这能解释问题。