В чем разница между require и require-dev?

Я новичок в composer и мне хотелось бы узнать разницу между require и require-dev . На сайте композитора нет хорошего объяснения различий между этими двумя.

Часть, которую я не получаю, представляет собой Lists packages required for developing this package, or running tests, etc. Из официальных документов Composer.

Solutions Collecting From Web of "В чем разница между require и require-dev?"

Пакеты require-dev – это пакеты, которые не нужны для работы вашего проекта и не должны включаться в производственную версию вашего проекта.

Как правило, это пакеты, такие как phpunit/phpunit которые вы будете использовать для модульного тестирования вашего проекта.

мне кажется ясным:

требовать

Перечисляет пакеты, требуемые этим пакетом. Пакет не будет установлен, если эти требования не будут выполнены.

require-dev (только для root)

Перечисляет пакеты, необходимые для разработки этого пакета (1) или запускает тесты и т. Д. Требования разработчика корневого пакета будут установлены только в том случае, если установка выполняется с --dev или если обновление выполняется без --no-dev .

http://getcomposer.org/doc/04-schema.md


1. пакеты, используемые для разработки пакета

Основное различие заключается в том, что Composer будет устанавливать только зависимости require-dev для «корневого пакета» – каталога, в котором вы запускаете composer install . Документация описывает это как:

Корневой пакет – это пакет, определенный composer.json в корне вашего проекта. Это основной composer.json который определяет ваши требования к проекту.

… и документация require-dev указывает, что она «только для root».

На практике это означает, что зависимостей require-dev пакета не используются, если пакет устанавливается как зависимость для чего-то другого (то есть он установлен в папку vendor другого проекта).

Поэтому, если у вас есть phpunit в списке require-dev для YourProject , и я клонирую ваш проект и запускаю composer install в yourproject/ , Composer будет устанавливать phpunit для yourproject/vendor/ , потому что, скорее всего, я делаю некоторую разработку на YourProject , В рамках разработки я, вероятно, захочу запустить тестовый набор YourProject , и для этого мне понадобится phpunit .

Но если я добавлю ваш проект как зависимость от MyProject , установка пакета myproject также установит пакет yourproject , но он не установит phpunit .

Вы можете переопределить это поведение с параметрами --dev и --no-dev , но поведение по умолчанию основано на том, является ли соответствующий пакет корневым пакетом .