picocli : List<> 选项,在@ArgGroup 中使用,在短用法字符串中重复
picocli : List<> Option, used in @ArgGroup, duplicated in short usage string
当 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
由于其他原因需要在代码中使用,在这个玩具示例中似乎是徒劳的。
您可能发现了 picocli 中的错误。
您介意在 picocli issue tracker 上提出这个问题吗?
更新:
短篇小说
这是一个错误。在下一版本的 picocli 中,可以通过将参数组设置为 exclusive = false
.
来实现预期的概要
说来话长
这个概要内容可能会变得非常复杂...让我们分解一下。
期权概要
在我们进入参数组之前,让我们先看看简单的选项。 Picocli 显示了必需和非必需选项以及单值和多值选项的不同概要。
下面table说明。请特别注意 必需的多值选项 的表示法。此类选项必须指定 至少一次,但可能多次 ,概要反映了这一点:
Required Non-Required
--------- ------------
Single value -x=N [-x=N]
Multi-value -x=N [-x=N]... [-x=N]...
参数组概要
现在,让我们看一下组。在 exclusive
组(默认)中,所有参数都是 自动生成的 required
。 (这背后有一些历史,但基本上其他任何东西都没有意义。)在非排他性组中,选项可以是必需的或可选的。
组有 multiplicity
。默认值为 multiplicity = "0..1"
,表示该组是可选的,这在概要中通过用 [
和 ]
方括号包围组来显示。
现在,让我们把这些放在一起。下面的 table 显示了具有两个选项的组的概要,-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]...]
拆分正则表达式概要
The final element: when the option accepts a split=","
regex, the N
parameter label becomes N[,N...]
in the synopsis.
问题:大纲太长
当我使用 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...]]...]
我希望这能说明问题。
当 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
由于其他原因需要在代码中使用,在这个玩具示例中似乎是徒劳的。
您可能发现了 picocli 中的错误。 您介意在 picocli issue tracker 上提出这个问题吗?
更新:
短篇小说
这是一个错误。在下一版本的 picocli 中,可以通过将参数组设置为 exclusive = false
.
说来话长
这个概要内容可能会变得非常复杂...让我们分解一下。
期权概要
在我们进入参数组之前,让我们先看看简单的选项。 Picocli 显示了必需和非必需选项以及单值和多值选项的不同概要。
下面table说明。请特别注意 必需的多值选项 的表示法。此类选项必须指定 至少一次,但可能多次 ,概要反映了这一点:
Required Non-Required
--------- ------------
Single value -x=N [-x=N]
Multi-value -x=N [-x=N]... [-x=N]...
参数组概要
现在,让我们看一下组。在 exclusive
组(默认)中,所有参数都是 自动生成的 required
。 (这背后有一些历史,但基本上其他任何东西都没有意义。)在非排他性组中,选项可以是必需的或可选的。
组有 multiplicity
。默认值为 multiplicity = "0..1"
,表示该组是可选的,这在概要中通过用 [
和 ]
方括号包围组来显示。
现在,让我们把这些放在一起。下面的 table 显示了具有两个选项的组的概要,-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]...]
拆分正则表达式概要
The final element: when the option accepts a split=","
regex, the N
parameter label becomes N[,N...]
in the synopsis.
问题:大纲太长
当我使用 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...]]...]
我希望这能说明问题。