X

Composer: разница между require и require-dev

Сегодня, в очередной раз, мне поступил вопрос о том, в чем разница между секциями require и require-dev в файле composer.json, давайте разберемся..

Начнем с того, что разберемся с немного другими терминами, а именно режимами (средами) в которых работает программное обеспечение, чаще всего это:

  • Development (разговорный термин - "девелоп") - режим в котором над программным обеспечением работают разработчики делая ту или иную функциональность, чаще всего в этом режиме включен вывод пользователю разнообразных ошибок и разной отладочной информации.
  • Testing (разговорный термин - тестинг) - режим в котором тестировщики тестируют готовую функциональность. Вывод ошибок пользователю и отладочной информации чаще всего включен.
  • Staging (разговорный термин - стейдж или стейджинг) - режим в котором заказчик тестирует готовую функциональность, вывод ошибок пользователю отключен и перенаправлен в лог файлы. Все настройки максимально приближены к продакшену.
  • Production (разговорный термин - продакшн) - Режим в котором программное обеспечение используют реальные пользователи. Выводить ошибки и делать правки в этом режиме не рекомендуется.

Данные 4-е режима можно разделить еще на две группы

  • Development + Testing = показываем ошибки и отладочную информацию, ведем разработку ПО
  • Staging + Production = НЕ показываем ошибки и отладочную информацию, НЕ ведем разработку в этих режимах.

В продакшн

Теперь вернемся к Composer-у. Он поддерживает два типа зависимостей, список зависимостей для разработки (require-dev) и список зависимостей для продакшена (require). Например, во время разработки,  мы можем что-то тестировать с помощью PHP Unit и нам нужна такая зависимость, но когда все готово и протестировано, нам это зависимость не нужна и ее нет смысла тащить на продакшен сервер, т.к. по логике тестировать там что-то нельзя.

  • Staging + Production = зависимости нужные для работы в этом режиме помещаем в секцию require, файла composer.json
  • Development + Testing = зависимости которые нужны в этих режимах, но еще не включены в require, помещаем в секцию require-dev, файла composer.json

Пример из файла composer.json, проекта на фреймворке Yii2

...
    "require": {
        "php": ">=7.2.0",
        "yiisoft/yii2": "~2.0.14",
        "yiisoft/yii2-bootstrap": "~2.0.0",
        "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0"
    },
    "require-dev": {
        "yiisoft/yii2-debug": "~2.1.0",
        "yiisoft/yii2-gii": "~2.1.0",
        "yiisoft/yii2-faker": "~2.0.0",
        "codeception/base": "~2.3.0",
        "codeception/verify": "~0.4.0",
        "codeception/specify": "~0.4.6",
        "symfony/browser-kit": ">=2.7 <=4.2.4"
    },
..

То, что находится в секции require - это обязательные зависимости для всех режимов, а то, что в секции require-dev только для режима "разработки".

Теперь, разберемся как устанавливать зависимости для разных режимов. Для режима разработки, мы просто запускаем

composer install

зависимости из обоих секций будут обработаны и установлены.

Для продакшен режима, мы используем опцию --no-dev, вот так

composer install --no-dev

в этом случае, будут установлены только зависимости из раздела require.

Если просуммировать все, то секции

  • require = зависимости для всех режимов
  • require-dev = зависимости только для режима разработки

указывают какие зависимости будут утсановлены, когда вы запускаете команды

  • composer install = зависимости из require и require-dev
  • composer install --no-dev = зависимости только из require

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

Категории: PHP