В чем разница между разделами require и require-dev в composer.json?
Я начинаю использовать композитор, я так мало знаю об этом и немного разбираюсь в разработке веб-приложений.
Я просто просматриваю Nettuts + Tutorial, поэтому у меня есть основной вопрос о композиторе.
{
"require": {
"laravel/framework": "4.0.*",
"way/generators": "dev-master",
"twitter/bootstrap": "dev-master",
"conarwelsh/mustache-l4": "dev-master"
},
"require-dev": {
"phpunit/phpunit": "3.7.*",
"mockery/mockery": "0.7.*"
},
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
},
"scripts": {
"post-update-cmd": "php artisan optimize"
},
"minimum-stability": "dev"
}
- Что бы ни появилось в части "require-dev", будет загружаться и устанавливаться только с установкой композитора --dev?
- Я прочитал некоторую документацию композитора, но до сих пор не понимаю, в чем причина того, что у нас есть часть "require-dev"? Это из-за того, что мы хотим получить конкретную версию пакета, а не всегда получать последнюю стабильную версию?
Ответы
Ответ 1
Различные среды
Как правило, программное обеспечение будет работать в разных средах:
-
development
-
testing
-
staging
-
production
Различные зависимости в разных средах
Зависимости, объявленные в разделе require
composer.json
, обычно являются зависимостями, которые необходимы для запуска приложения или пакета в
тогда как зависимости, объявленные в разделе require-dev
, обычно являются зависимостями, которые требуются в
среды.
Например, в дополнение к пакетам, используемым для фактического запуска приложения, для разработки программного обеспечения могут потребоваться пакеты, такие как:
-
friendsofphp/php-cs-fixer
(для обнаружения и исправления проблем стиля кодирования)
-
squizlabs/php_codesniffer
(для обнаружения и исправления проблем стиля кодирования)
-
phpunit/phpunit
(для управления разработкой с помощью тестов)
- и др.
Развертывание
Теперь, в средах development
и testing
, вы обычно запускаете
$ composer install
для установки зависимостей production
и development
.
Однако в средах staging
и production
вы хотите установить зависимости, необходимые для запуска приложения, и как часть процесса развертывания обычно вы запускаете
$ composer install --no-dev
для установки только зависимостей production
.
Семантика
Другими словами, разделы
укажите composer
, какие пакеты должны быть установлены при запуске
$ composer install
или
$ composer install --no-dev
Вот и все.
Примечание Зависимости от разработки пакетов, от которых зависит ваше приложение или пакет, никогда не будут установлены
Для справки см.:
Ответ 2
-
В соответствии с руководство для композитора:
require-dev (только для root)
Список пакетов, необходимых для разработки этого пакета или выполнения тестов и т.д. Требования разработчика корневого пакета устанавливаются по умолчанию. Оба install
или update
поддерживают параметр --no-dev
, который предотвращает установку зависимостей между разработчиками.
Таким образом, запуск composer install
также загрузит зависимости развития.
-
Причина на самом деле довольно проста. При внесении вклада в конкретную библиотеку вы можете запускать тестовые пакеты или другие инструменты разработки (например, symfony). Но если вы установите эту библиотеку в проект, эти зависимости могут не потребоваться: не для каждого проекта требуется тестовый бегун.
Ответ 3
С сайта композитора (это достаточно ясно)
требуется #
Перечисляет пакеты, требуемые этим пакетом. Пакет не будет если эти требования не выполняются.
require-dev (только для root) #
Перечисляет пакеты, необходимые для разработки этого пакета или запуска тестов, и т.д. Требования разработчика корневого пакета устанавливаются по умолчанию. Оба варианта установки или обновления поддерживают опцию -no-dev, которая предотвращает установку зависимостей между разработчиками.
Используя require-dev в Composer, вы можете объявить зависимости, необходимые для разработки/тестирования проекта, но не нуждающиеся в производстве. Когда вы загружаете проект на ваш производственный сервер (используя git), часть require-dev
будет проигнорирована.
Также проверьте этот ответ, опубликованный автором и этот пост.
Ответ 4
требуется раздел
В этом разделе содержатся пакеты/зависимости, которые являются лучшими кандидатами для установки/требуются в рабочей среде.
require-dev раздел: В этом разделе содержатся пакеты/зависимости, которые разработчик может использовать для тестирования кода (or for the experiment purpose on her local machine and she wants these packages should not be installed on the production environment.)
Ответ 5
Общее правило заключается в том, что вы хотите, чтобы пакеты из секции require-dev были только в средах разработки (dev), например, в локальной среде.
Пакеты в разделе require-dev - это пакеты, которые помогают отлаживать приложение, запускать тесты и т.д.
В промежуточной и производственной среде, возможно, вам нужны только пакеты из раздела require.
Но в любом случае вы можете запустить установку композитора --no-dev и composer update --no-dev в любой среде, команда будет устанавливать только пакеты из требуемого раздела, а не из require-dev, но, вероятно, вы хотите запустить это только при постановке и выпуске среды не на местном уровне.
Теоретически вы можете поместить все пакеты в требуемый раздел, и ничего не произойдет, но вы не хотите создавать пакеты в рабочей среде по следующим причинам:
- скорость
- возможность публикации некоторой информации об отладке
- и т.д
Некоторые хорошие кандидаты на require-dev:
"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"
вы можете видеть, что делают вышеперечисленные пакеты, и вы увидите, почему они вам не нужны на производстве.
Подробнее см. Здесь: https://getcomposer.org/doc/04-schema.md