Есть ли полный синтаксический анализатор командной строки для PHP? - PullRequest
7 голосов
/ 02 июля 2011

Я ищу библиотеку для разбора команд, похожую на Thor , но для PHP.

Более конкретно, я хотел бы что-то, что может ...

  • обрабатывает ввод подкоманд, например, git remote add <url>
  • связывает опции с их значениями, например, my-command --some-option='value' создает пару ключ-значение, например array( 'some-option' => 'value' )
  • , генерирует информацию об использовании / справке из конфигурации
  • обрабатывает опции -short и --long
  • библиотека поддерживается
  • должен быть на PHP (в противном случае я бы использовал Thor)

Ни одно из решений, на которые я смотрел до сих пор, не было удовлетворительным.

Ближайшая вещь для достижения цели - это PEAR Console_Getargs , хотя это не

Команда pear использует Console_Getopt , хотя они выполняют значительную часть ручной обработки, чтобы реализовать функции, указанные в моих первых трех требованиях.

PHP getopt() не может обрабатывать подкоманды, и нетпохоже, это какие-то другие встроенные методы, которые приближают эту функциональность.

Существует ли библиотека PHP, которая соответствует этим критериям, которые я, возможно, пропустил?

Ответы [ 5 ]

7 голосов
/ 21 августа 2012

GetOptionKit анализирует аргументы, обрабатывает подкоманды, автоматически генерирует справку и имеет приятный API. Требуется PHP 5.4+. Он размещен на GitHub и, похоже, активно поддерживается.

Для логических опций:

-d   => ["debug" => true]
--debug => ["debug" => true]

Для дополнительных параметров:

-v => [ "verbose" => 1 ]
-vv => [ "verbose" => 2 ]
-vvv => [ "verbose" => 3 ]

Для нескольких значений значения:

--foo=bar   => [ "foo" => "bar" ]
--foo=bar --foo=zoo => [ "foo" => ["bar", "zoo"] ]

Существует также опция ограничения типа, которая поможет вам получить значение опции, например:

--output=file  => [ "output" => SplFileInfo Object ]
6 голосов
/ 02 июля 2011
3 голосов
/ 09 июня 2016

Getopt.php соответствует вашим потребностям.

Кроме того, его истинно объектно-ориентированный интерфейс помогает вам писать элегантный код PHP.

Он хорошо документирован и не имеет внешних зависимостей.

Особенности

  • Поддерживает как короткие (например, -v), так и длинные (например, --version) опции
  • Опция алиасинга, т.е.опция может иметь как длинную, так и короткую версию
  • Свернутые короткие опции (например, -abc вместо -a -b -c)
  • Совокупные параметры (например, -vvv)
  • Опции могут принимать необязательные или обязательные аргументы
  • Две альтернативные записи для длинных опций с аргументами: --option value и --option=value
  • Свернутые короткие опции с обязательным аргументом в конце (например,-ab 1 вместо -a -b 1)

Пример кода

<?php

use Ulrichsg\Getopt\Getopt;
use Ulrichsg\Getopt\Option;

$getopt = new Getopt(array(
    new Option('m', 'mode', Getopt::REQUIRED_ARGUMENT),
    new Option('p', 'parents'),
    new Option('v', 'verbose'),
    new Option('Z', 'context', Getopt::REQUIRED_ARGUMENT),
    new Option(null, 'help'),
    new Option(null, 'version')
));

try {
    $getopt->parse();

    if ($getopt['version']) {
        echo "Getopt example v0.0.1\n";
        exit(0);
    }

    // Error handling and --help functionality omitted for brevity

    $createParents = ($getopt['parents'] > 0);
    // Note that these are null if the respective options are not given
    $mode = $getopt['mode'];
    $context = $getopt['context'];

    $dirNames = $getopt->getOperands();

    makeDirectories($dirNames, $createParents, $mode, $context);
} catch (UnexpectedValueException $e) {
    echo "Error: ".$e->getMessage()."\n";
    echo $getopt->getHelpText();
    exit(1);
}
3 голосов
/ 20 июня 2012

Я использую это https://gist.github.com/2959619 довольно успешно на некоторое время. Он короткий (~ 30 строк) и поддерживает обе подкоманды, называемые короткими и длинными аргументами.

При использовании в больших проектах я бы порекомендовал компонент Symfony Console . Его возможности выходят за рамки синтаксического анализа командной строки, но это здорово.

2 голосов
/ 11 апреля 2014

Если somone ищет независимое от фреймворка решение со следующими функциями:

  • Простой синтаксис определения
  • Поддерживает длинные и короткие имена arugment
  • Поддерживает повторяющиеся аргументы (например, -v -v -v)
  • Поддерживает несколько коротких аргументов (например, -abc vs -a -b -c)
  • Поддерживает 2 способа установки значений (например, --name = abc или --name abc)
  • Поддерживает двойной разделитель тире для конечных значений
  • строит определение использования

Я бы предложил этот продукт https://github.com/webtrendi/clapp

...