【问题标题】:picocli : List<> Option, used in @ArgGroup, duplicated in short usage stringpicocli : List<> 选项,在@ArgGroup 中使用,在短用法字符串中重复
【发布时间】:2020-05-22 22:30:03
【问题描述】:

List&lt;&gt; 选项用于@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


    【解决方案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]...]
    

    拆分正则表达式概要

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

    我希望这能说明问题。

    【讨论】:

    • 好的,我知道了here
    • 感谢您对此进行如此详细的跟进。我现在可以更好地跟踪输出了。
    • 如果这个答案对您有用,请考虑接受它(或许还可以投票)。
    猜你喜欢
    • 2021-04-18
    • 2021-12-13
    • 2020-09-09
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2023-03-24
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多