Консольные войны – PHP CLI библиотеки

php cli commad console

Я всегда был большим фанатом консольных команд и я стараюсь предоставлять консольный командный инструмент () на столько, на сколько это возможно, в в большинстве моих PHP проектах.

В этой статье я кратко сравню три PHP консольные библиотеки:

php cli commad console

 

Истории создания

 

 Symfony старейшая и самая популярная, используется во множестве проектов (и, очевидно, часть Symfony фреймворка). С множеством контрибьюторов это стало первым выбором для многих разработчиков.

Hoa это модульный, расширяемый и структурированный набор из PHP библиотек, которые включает  Hoa консоль. Она стремится быть мостом между индустриальным и исследовательским миром и это делает этот проект достаточно интересным.

Консоль Webmozart это новейший проект, стремится быть легким, дружелюбным к тестам и добавить новый функционал поверх консоли Symfony.

 

Зависимости, Размер и Сложность

 

Консоль Symfony только предлагает зависимости, в отличии от  бибилотеки Hoa консоль, которая зависит от некоторых библиотек проекта Hoa. Проект Webmozart так же прямо зависит от консоли Symfony.

Консоль Hoa имеет наименьшее число LOC (Logical Lines of Code (логические строки кода)) ~1397, далее следует Symfony консоль ~2226 и Webmozart ~3126 (без зависимостей)

Для получения примерного индикатора сложности этих проектов, ниже приведены некоторые данные из ихнего PHPLOC анализа*:


Description Symfony Hoa Webmozart
Cyclomatic Complexity
Average Complexity per LLOC 0.37 0.36 0.26
Average Complexity per Class 14.73 25.14 8.84
Average Complexity per Method 2.55 3.38 1.99
Dependencies
Global Accesses 3 20 1
Attribute Accesses 807 217 1285
Method Calls 1103 324 1320

*Анализ выполнен только в главном каталоге исходников, исключая папку тестов, если присутствует.

 

Практический пример

 

Описание

Для обзора функционала каждой библиотеки и просмотра кода в действии, давайте реализуем бизнес требование, которое описывает следующий пример использования:

Финальным консольным вызовом должно быть что-то похожее на:

somemsg --message='Good Morning' Nicola Bruno --color=green --up

и вывод должен быть:

 

Реализация

 

Для начала мы должны определить PHP Message, используемый в каждой реализации консоли для реализации примера.

Ниже некоторый достаточно простой код:

Консоль Symfony

 

Для того, чтобы создать консольную команду в Symfony необходимо:

  • Создать класс команды
    – Сконфигурировать аргументы и опции
    – Написать логику
  • Создать приложение

 

Создание команды

 

Метод configure используется для задания аргументов и опций для команды.

Метод addArgument может принимать следующие параметры: addArgument($name, $mode, $description, $default)


type name description
string $name Имя аргумента
int $mode Режим аргумента: InputArgument::REQUIRED или InputArgument::OPTIONAL
string $description Текст описания
mixed $default Значение по умолчанию (только для режима InputArgument::OPTIONAL)

addOption может принимать следующие параметры: addArgument($name, $shortcut, $mode, $description, $default)


type name description
string $name Имя опции
string $shortcut Сокращение (может быть null)
int $mode Режим опции: Одна из InputOption::VALUE_* констант
string $description Текст описания
mixed $default Значение по умолчанию (должно быть null для InputOption::VALUE_REQUIRED или InputOption::VALUE_NONE)

 

Доступны три способа для цветного вывода:

  • Использовать предустановленный тег (как: $output->writeln('<info>foo</info>');  для вывода зеленым)
  • Определить стиль используя класс OutputFormatterStyle
  • Установить цвет внутри имени тега, как:

 

Доступные цвета переднего плана и фона: черный, красный, зеленый, желтый, синий, пурпурный и бирюзовый. Доступные опции: жирный, подчеркнутый, мигающий, обратный и скрытый.

Больше информации в оффициальной документации Symfony.

Заметка: по умолчанию командная консоль Windows не поддерживает цветной вывод. Вам нужны (и необходимо установить) Git tools и другие более продвинутые командные консоли.

 

Создание приложения

После конфигурирования и исполнения мы почти закончили. Последний шаг это создание PHP файла для запуска команды.

Пример консольного вызова:

Консоль Symfony так же автоматически предоставляет вывод помощи с –help аргументом.

 

Консоль Hoa

 

Консоль Hoa следует мене структурированному подходу для конфигурации консольной команды.

Процесс состоит из следующих шагов:

  • Распознавание команды
  • Получение опций и ввода
  • Выполнение логики

Распознавание команды

Получение опций и ввода

 

Выполнение логики

Для раскраски вывода возможно сменить цвет у Cursor.

Консоль Hoa поддерживает широкий набор цветов.
Цвет может быть установлен по имени (черный, красный, зеленый, желтый…), по номеру (от 0 до 256 представляет 264 цветовую палитру) или через шестнадцатиричный код #rrggbb, например:

Базовое использование в примере не предоставляет автоматического вывода помощи и не строго ООП ориентировано, но наследование от  Hoa\Console\Dispatcher\Kit  (требует hoa/dispatcher) может добавить больше гибкости (больше информации в официальной документации).

Команда может быть вызвана так:

Одна из сильных сторон консоли Hoa в том, что она предоставляет дополнительные API классы для манипуляции важными элементами, поддерживая разные профили терминала:

  • The Cursor (движение, очистка, показ, раскраска, …)
  • The Mouse (прослушиваение действий мышью)
  • The Window (setSize, скроллинг, минимизация, …)
  • Терминальная линия  Readline (история, автозавершение, и др.)

 

Консоль Webmozart

 

Процесс создания команды в консоли Webmozart состоит из:

  • конфигурирование аргументов и опций
  • написнаие логики
  • создание приложения

Консоль Webmozart следует подходу похожему на консоль Symfony, но с ясным разделением между конфигурацией и выполнением логики.

 

Конфигурация

 

Логика

 

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

Другие преимущества консоли Webmozart это:

  • поддержка подкоманд:
  • поддержка страницы руководства (как git help remote)
  • адаптеры для консоли  Symfony (чтобы использовать классы Symfony как ProgressBar)

 

Создание приложения

Файл приложения для запуска команды схож файлом Symfony:

Консольный вызов:

 

Заключительные мысли

 

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

  • консоль Symfony хорошо протестирована, надежна, с хорошей документацией и функциями для решения большинства обычных способов использования.
  • консоль Hoa более индустриально ориентирована, идеальна для манипулирования терминальным окружением (мышь, курсор, окно и так далее).
  • консоль Webmozart нова (скоро будет стабильный релиз), но очень удобна для работы с проектами, которые имеют склонность расти до больших размеров.

Вы используете какие-то из них регулярно? Если да, то какие? Что вы скажете о плюсах и минусах каждой из них? Вы можете предложить других претендентов? Дайте нам знать!

 

Оригинал на английском:

http://www.sitepoint.com/console-wars-php-cli-libraries/

Это мой перевод. Если вы заметили ошибки или считаете, что какие-то части можно перевести лучше – пишите в комментарии.