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...]]...]

我希望这能说明问题。