【问题标题】:Cannot create CLI with specific with synopsis - CLI with Picocli无法创建具有特定概要的 CLI - 带有 Picocli 的 CLI
【发布时间】:2020-06-10 22:40:22
【问题描述】:

我想在 picocli 中创建一个具有以下概要的 CLI

Command (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>] | --option2=<value2> [--req21=<v21> --req22=<v22>] | --option3=<value3> | --option4=<value4>) 

我尝试创建嵌套组,但没有成功。 有什么帮助吗?

提前致谢

【问题讨论】:

    标签: command-line-interface command-line-arguments options picocli


    【解决方案1】:

    使用嵌套组,我能够创建以下概要:

    Usage: mycmd ((--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>])
                 | (--option2=<value2> [--req21=<v21> --req22=<v22>]) |
                 (--option3=<value3>) | (--option4=<value4>))
    

    这在功能上与您的目标概要相同,但有一些多余的大括号。

    代码如下:

    import picocli.CommandLine;
    import picocli.CommandLine.ArgGroup;
    import picocli.CommandLine.Command;
    import picocli.CommandLine.Option;
    
    @Command(name = "mycmd")
    public class SynopsisDemo implements Runnable {
    
        static class Group1 {
            @Option(names = "--option1", required = true)
            String value1;
    
            @ArgGroup(exclusive = false, multiplicity = "0..1")
            Group1Inner inner1;
        }
    
        static class Group1Inner {
            @Option(names = "--req11", required = true) String v11;
            @Option(names = "--req12", required = true) String v12;
            @Option(names = "--req13", required = true) String v13;
        }
    
        static class Group2 {
            @Option(names = "--option2", required = true)
            String value2;
    
            @ArgGroup(exclusive = false, multiplicity = "0..1")
            Group2Inner inner2;
        }
    
        static class Group2Inner {
            @Option(names = "--req21", required = true) String v21;
            @Option(names = "--req22", required = true) String v22;
        }
    
        static class Group3 {
            @Option(names = "--option3", required = true)
            String value3;
        }
    
        static class Group4 {
            @Option(names = "--option4", required = true)
            String value4;
        }
    
        static class AllGroups {
            @ArgGroup(exclusive = false, multiplicity = "1") Group1 group1;
            @ArgGroup(exclusive = false, multiplicity = "1") Group2 group2;
            @ArgGroup(exclusive = false, multiplicity = "1") Group3 group3;
            @ArgGroup(exclusive = false, multiplicity = "1") Group4 group4;
        }
    
        @ArgGroup(exclusive = true, multiplicity = "1")
        AllGroups allGroups;
    
        @Override
        public void run() {
            // business logic here
        }
    
        // Goal:
        // Command (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>]
        //         | --option2=<value2> [--req21=<v21> --req22=<v22>]
        //         | --option3=<value3> | --option4=<value4>)
        public static void main(String[] args) {
            //new CommandLine(new SynopsisDemo()).execute(args);
            new CommandLine(new SynopsisDemo()).usage(System.out);
        }
    }
    

    我尝试通过将 @Option 定义移出 Group3/4 并移至 AllGroups 来摆脱 --option3--option4 周围的大括号,但这导致这些选项移至概要的开头:

    Usage: mycmd (--option3=<value3> | --option4=<value4> | (--option1=<value1>
                 [--req11=<v11> --req12=<v12> --req13=<v13>]) | (--option2=<value2>
                 [--req21=<v21> --req22=<v22>]))
    

    然后我尝试通过指定 order 将这些选项移到末尾,如下所示:

    static class AllGroups {
        @ArgGroup(exclusive = false, multiplicity = "1") Group1 group1;
        @ArgGroup(exclusive = false, multiplicity = "1") Group2 group2;
        @Option(names = "--option3", required = true, order = 3) String value3;
        @Option(names = "--option4", required = true, order = 4) String value4;
    }
    

    但貌似order目前只能用于选项列表中的control where optionsarg-groups appear,不影响剧情。为此,我在 picocli 问题跟踪器中打开了 this issue。非常欢迎您对该票提出意见。

    解决方法

    同时,您可以通过指定custom synopsis 来获得所需的准确概要,如下所示:

    @Command(name = "mycmd",
            customSynopsis = {
                    "mycmd (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>]",
                    "       | --option2=<value2> [--req21=<v21> --req22=<v22>]",
                    "       | --option3=<value3> | --option4=<value4>)"
            })
    public class SynopsisDemo implements Runnable { // ...
    

    这导致以下概要(我认为符合您的要求):

    Usage: mycmd (--option1=<value1> [--req11=<v11> --req12=<v12> --req13=<v13>]
           | --option2=<value2> [--req21=<v21> --req22=<v22>]
           | --option3=<value3> | --option4=<value4>)
    

    【讨论】:

    • 非常感谢!第一个概要也适用于我。我之前没有注意到 picocli 指南中的自定义概要部分。有趣的一点。 + 我会检查新问题:)
    • 很高兴听到这个消息。自动生成概要会更好,因此您无需手动维护它。享受 picocli!
    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多