Парсер командной строки и отсутствие подкоманды и группировки? - PullRequest
8 голосов
/ 12 октября 2011

Я знаю, что этот вопрос задавался много раз здесь и в других местах, пока я искал ответ.Тем не менее, меня все еще удивляет, почему библиотека синтаксического анализатора командной строки не предоставляет этот общий сценарий использования, где у меня есть группа подкоманд, каждая подкоманда имеет свой собственный набор обязательных и необязательных аргументов.Подобная конструкция может быть найдена в git / svn, хотя в их случае команда подкоманды является автономной программой, если я не ошибаюсь.

Подводя итог, то, что я ищу, это простой способ:

top_command subcmd_A [ command A's options ....]
top_command subcmd_B [ command B's options ....]
...

В мире Java двумя часто упоминаемыми библиотеками являются Apache Command CLI и JSAP.Я не вижу, чтобы кто-либо из них имел это в виду - хотя вы, вероятно, могли бы подстроить и настроить многое, чтобы соответствовать ... но основной поток определения опции, зарегистрироваться ... затем, в конце, разобрать их все не 'Если рассматривать случай с разными подкомандами, валидация и синтаксический анализатор должны вести себя по-разному.

Может быть, в данном случае принято считать, что это слишком специфично для приложения и должно быть оставлено на усмотрение самого приложения.Один из способов, который я могу придумать, - это определить класс BaseCommand, и каждая подкоманда расширяет его и регистрирует себя ... как способ разбить его на части для простого управления.Если бы любая зрелая среда могла сделать это, я был бы признателен за любой указатель здесь.

Хотя я могу ошибаться в своем понимании возможностей текущего синтаксического анализатора, любое понимание очень ценится.

Ответы [ 4 ]

6 голосов
/ 12 октября 2011

Привет, просто взгляните на jcommander , который точно поддерживает описанный сценарий.Вы упомянули Commons CLI, что верно в выпусках 1.X, но существует разработка для CLI2, которая также поддерживает это, но, к сожалению, этот выпуск никогда не был опубликован.

Другим хорошим решением было бы https://picocli.info/

2 голосов
/ 30 июня 2017

picocli поддерживает вложенные подкоманды на произвольную глубину.

Основная команда определяет глобальные параметры, каждый следующий уровень вложенных команд может добавлять параметры, которые применяются только к этому уровню.

CommandLine commandLine = new CommandLine(new MainCommand())
        .addSubcommand("cmd1", new ChildCommand1()) // 1st level
        .addSubcommand("cmd2", new ChildCommand2())
        .addSubcommand("cmd3", new CommandLine(new ChildCommand3()) // 2nd level
                .addSubcommand("cmd3sub1", new GrandChild3Command1())
                .addSubcommand("cmd3sub2", new GrandChild3Command2())
                .addSubcommand("cmd3sub3", new CommandLine(new GrandChild3Command3()) // 3rd
                        .addSubcommand("cmd3sub3sub1", new GreatGrandChild3Command3_1())
                        .addSubcommand("cmd3sub3sub2", new GreatGrandChild3Command3_2())
                                // etc
                )
        );

Вам также может понравиться помощь по использованию стилей и цветов ANSI.

Обратите внимание, что в справке по использованию перечислены зарегистрированные подкоманды в дополнение к опциям и позиционным параметрам.

enter image description here

Справка по использованию легко настраивается с помощью аннотаций.

enter image description here

  • аннотация на основе
  • подкоманды в стиле git
  • вложенные подкоманды
  • строго типизированные параметры опции
  • строго типизированные позиционные параметры
  • настраиваемое преобразование типов
  • многозначные опции
  • интуитивно понятная модель количества аргументов, потребляемых полем
  • свободный API
  • кластерные короткие опции в стиле POSIX
  • Длинные опции в стиле GNU
  • разрешает любой префикс
  • ANSI цвета в использовании помогают
  • настраиваемая справка по использованию
  • один исходный файл: включите в качестве источника, чтобы сохранить приложение в одной банке
2 голосов
/ 28 августа 2013

Args4j теперь поддерживает подкоманды (начиная с версии 2.0.23 или около того).

0 голосов
/ 05 июля 2014

Посмотрите на cli-parsec. Это показывает (среди прочего) именно то, что я считаю, что вы хотите :-) https://github.com/dr1fter/cli-parsec

Имеет произвольную вложенность подкоманд (подкоманды могут иметь подкоманды и т. Д.). Каждая подкоманда может определять параметры. Здесь приведен простой пример (две подкоманды с индивидуальными параметрами): https://github.com/dr1fter/cli-parsec/wiki/Example

Фрагмент Maven:

<dependency>
    <groupId>de.dr1fter</groupId>
    <artifactId>de.dr1fter.cli-parsec>
    <version>0.2.1</version>
</dependency>
...