1

在 中使用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由于其他原因在代码中需要它,但在这个玩具示例中似乎是徒劳的。

4

1 回答 1

1

您可能在 picocli 中发现了一个错误。你介意在 picocli问题跟踪器上提出这个问题吗?


更新:

短篇小说

这是一个错误。在 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]...]

拆分正则表达式概要

The final element: when the option accepts a split=","regex, the Nparameter 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...]]...]

我希望这能解释事情。

于 2020-05-23T01:52:39.887 回答