Могут ли подкоманды picocli иметь параметры с одинаковым именем? - PullRequest
2 голосов
/ 15 мая 2019

У меня есть программа, которая выполняет различные виды статистического анализа. Я хотел бы определить подкоманду для каждого типа анализа. Родительская команда будет главной точкой входа в программу. Я получаю сообщение об ошибке, в котором говорится, что «опция должна быть указана только один раз», когда мои подкоманды имеют опции с одинаковым именем. Кажется, проблема в том, как я называю подкоманды. В приведенном ниже примере input1 и input2 работают правильно. Когда я пытаюсь использовать обе подкоманды одновременно (input3), я получаю сообщение об ошибке.

Код ниже демонстрирует проблему. Если вход содержит обе подкоманды (то есть input3), я получаю сообщение об ошибке "option '-id' в index 0 () должен быть указан только один раз".

Как я могу вызвать обе подкоманды одновременно, как в input3?

import picocli.CommandLine;

import java.util.concurrent.Callable;

@CommandLine.Command(name = "myprogram", subcommands = {TestCase.FrequencyCommand.class, TestCase.HistogramCommand.class})
public class TestCase  implements Callable<Void> {

    public TestCase(){

    }

    public Void call() {
        System.out.println("Main program called");
        return null;
    }

    public static void main(String[] args){

        String[] input1 = {"frequency", "-id", "1001", "-table", "ex1"};
        String[] input2 = {"histogram", "-id", "1002", "-table", "ex5" };
        String[] input3 = {"frequency", "-id", "1001", "-table", "ex1", "histogram", "-id", "1002", "-table", "ex5" };

        CommandLine commandLine = new CommandLine(new TestCase());
        System.out.println("==Test1==");
        commandLine.execute(input1);
        System.out.println();

        System.out.println("==Test2==");
        commandLine.execute(input2);
        System.out.println();

        System.out.println("==Test3==");
        commandLine.execute(input3);
        System.out.println();

    }




    @CommandLine.Command(name = "frequency", description = "Frequency analysis.")
    static class FrequencyCommand implements Callable<Void> {

        @CommandLine.Option(names = {"-id"}, arity = "1..*", description = "Unique case identifier")
        public String id;

        @CommandLine.Option(names = "-table", arity = "1..*", description = "Database table")
        public String table;

        public FrequencyCommand(){

        }

        public Void call() {
            System.out.println("Frequency");
            System.out.println("ID = " + id);
            System.out.println("Table = " + table);
            return null;
        }
    }

    @CommandLine.Command(name = "histogram", description = "Histogram plot.")
    static class HistogramCommand implements Callable<Void> {

        @CommandLine.Option(names = {"-id"}, arity = "1..*", description = "Unique case identifier")
        public String id;

        @CommandLine.Option(names = "-table", arity = "1..*", description = "Database table")
        public String table;

        public HistogramCommand(){

        }

        public Void call() {
            System.out.println("Histogram");
            System.out.println("ID = " + id);
            System.out.println("Table = " + table);
            return null;
        }
    }

}

Результат, который я ожидаю увидеть:

== Test1 ==
Частота
ID = 1001
Таблица = ex1

== Test2 ==
Гистограмма
ID = 1002
Таблица = ex5

== Test3 ==
Частота
ID = 1001
Таблица = ex1
Гистограмма
ID = 1002
Таблица = ex5

1 Ответ

1 голос
/ 16 мая 2019

Последний пример вызывает две подкоманды, frequency и histogram, которые являются братьями и сестрами (у них одна и та же родительская команда).

Это еще не поддерживается в picocli 4.0.0-alpha-3: в настоящее время picocli ожидает, что подкоманды будут иерархией.

Однако, поддержка этого есть в списке задач, см. GitHub tickets # 454 и # 319 .

Запросы на извлечение приветствуются, если вы хотите ускорить процесс. : -)

...