picocli:List <>选项,在@ArgGroup中使用,在简短的用法字符串中重复

时间:2020-05-22 22:30:03

标签: picocli

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,在这个玩具示例中,它似乎是徒劳的。

1 个答案:

答案 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 = falsetrue):

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

我希望这能解释问题。