Невозможно создать CLI с указанным c с кратким описанием - CLI с Picocli - PullRequest
1 голос
/ 27 февраля 2020

Я хотел бы создать CLI в picocli со следующим кратким описанием

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

Я пытался создать вложенные группы, но это не сработало. Любая помощь ?

Заранее спасибо

1 Ответ

1 голос
/ 27 февраля 2020

Используя вложенные группы, я смог создать этот синопсис:

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);
    }
}

Я попытался избавиться от скобок вокруг --option3 и --option4, переместив определения @Option из Group3 / 4 в AllGroups, но в результате эти опции переместились в начало краткого изложения:

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 может в настоящее время используется только для контроля, где опции и arg-groups появляются в списке опций, это не влияет на краткий обзор. Для этого я открыл эту проблему в системе отслеживания проблем picocli. Мы приветствуем ваш ввод в этот тикет.

Обходной путь

Между тем, вы можете получить точный нужный вам синопсис, указав пользовательский синопсис , например:

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