В чем разница между разделами require и require-dev в composer.json?

102

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

Я просто просматриваю 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"
}
  1. Все, что появляется "require-dev"частично, будет загружено и установлено только с помощью composer install --dev?
  2. Я прочитал кое-что из документации композитора, но все еще не понимаю, по какой причине мы расстались "require-dev"? Это потому, что мы хотим получить конкретную версию пакета, а не всегда получать последнюю стабильную версию?
Ремесленник
источник
По теме: stackoverflow.com/q/16679589/82216
sampablokuper

Ответы:

121

Различная среда

Обычно программное обеспечение работает в разных средах:

  • development
  • testing
  • staging
  • production

Различные зависимости в разных средах

Зависимости, которые объявлены в requireразделе composer.json, обычно являются зависимостями, которые необходимы для запуска приложения или пакета в

  • staging
  • production

среды, тогда как зависимости, объявленные в require-devразделе, обычно являются зависимостями, которые требуются в

  • developing
  • testing

среды.

Например, в дополнение к пакетам, используемым для фактического запуска приложения, для разработки программного обеспечения могут потребоваться пакеты, такие как:

  • friendsofphp/php-cs-fixer (для обнаружения и исправления проблем со стилем кодирования)
  • squizlabs/php_codesniffer (для обнаружения и исправления проблем со стилем кодирования)
  • phpunit/phpunit (управлять разработкой с помощью тестов)
  • и т.п.

Развертывание

Теперь, в developmentи testingусловиях, вы, как правило , работать

$ composer install

установить оба productionиdevelopment зависимости.

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

$ composer install --no-dev

устанавливать только productionзависимости.

Семантика

Другими словами, разделы

  • require
  • require-dev

укажите, composerкакие пакеты должны быть установлены при запуске

$ composer install

или

$ composer install --no-dev

Это все.

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

Для справки см:

localheinz
источник
Правильно ли я понимаю, что это не имеет никакого значения, если я «разверну», закачав всю vendorпапку по FTP?
pilat 06
2
@pilat Можно, но не забудьте установить с помощью —no-dev. Кроме того, FTP, вероятно, будет довольно медленным.
localheinz
Как насчет зависимостей, которые нужны вам только для создания вашего приложения? Итак, в конвейере сборки и развертывания я хотел бы установить их для сборки, а затем снова удалить их перед развертыванием. Например, для минификации или превращения LESS / SASS в css. Как бы Вы это сделали?
Ричард Кифер
1
@RichardKiefer Некоторые люди используют phar.io , другие проверяют в PHAR, третьи используют образы Docker, а также некоторые люди используют отдельные composer.json- см., Например, github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz
Итак, вы бы только зафиксировали composer.json и заблокировали свое репо? Разве не имеет смысла фиксировать все, а для развертывания просто вытащить основную ветку из производства с помощью git?
mbomb007
62
  1. Согласно руководству композитора :

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

    Перечисляет пакеты, необходимые для разработки этого пакета, запуска тестов и т. Д. Требования разработчика корневого пакета установлены по умолчанию. Оба installили updateподдерживают --no-devпараметр, предотвращающий установку зависимостей разработчика.

    Таким образом, запуск composer installтакже загрузит зависимости разработки.

  2. Причина на самом деле довольно проста. При внесении вклада в конкретную библиотеку вы можете захотеть запустить тестовые наборы или другие инструменты разработки (например, symfony). Но если вы установите эту библиотеку в проект, эти зависимости разработки могут не потребоваться: не для каждого проекта требуется средство запуска тестов.

Флоран
источник
19

С сайта композитора (достаточно понятно)

требуется #

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

require-dev (только root) #

Перечисляет пакеты, необходимые для разработки этого пакета, запуска тестов и т. Д. Требования разработчика корневого пакета установлены по умолчанию. И установка, и обновление поддерживают параметр --no-dev, который предотвращает установку зависимостей dev.

Используя require-dev в Composer, вы можете объявить зависимости, необходимые для разработки / тестирования проекта, но не нужные в производстве. Когда вы загружаете проект на свой производственный сервер (используя git), require-devчасть будет проигнорирована.

Также проверьте этот ответ, опубликованный автором, и этот пост .

Альфа
источник
3
Пожалуйста, объясните мне, почему "way / generators": "dev-master" находится в разделе "require"? Мне он больше не нужен в производстве.
Artisan
1
Это полное предположение, но единственное, что я могу придумать, это то, что, поскольку способ / генераторы добавляются в качестве поставщика услуг, если он отсутствует в производственной среде, Laravel не будет работать.
Дэниел Холландс
2
В части «Требования для разработчиков» корневого пакета установлены по умолчанию, четко указано, что зависимости от require-dev установлены даже на рабочем сервере.
Gemmu
3
Идея состоит в том, чтобы вы использовали флаг --no-dev в продакшене.
Джон Панкост
2

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

Раздел require-dev: этот раздел содержит пакеты / зависимости, которые может использовать разработчик для тестирования своего кода (или для экспериментов на своем локальном компьютере, и она не хочет, чтобы эти пакеты были установлены в производственной среде).

MKJ
источник
1

Общее правило состоит в том, что вам нужны пакеты из раздела require-dev только в средах разработки (dev), например в локальной среде.

Пакеты в разделе require-dev - это пакеты, которые помогают вам отлаживать приложение, запускать тесты и т. Д.

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

Но в любом случае вы можете запустить composer install --no-dev и composer update --no-dev в любой среде, команда установит только пакеты из требуемого раздела, а не из require-dev , но, вероятно, вы захотите запустить это только на стадии подготовки и производства среды не на локальных.

Теоретически вы можете поместить все пакеты в требуемый раздел, и ничего не произойдет, но вы не хотите разрабатывать пакеты в производственной среде по следующим причинам:

  1. скорость
  2. возможность раскрыть некоторую отладочную информацию
  3. так далее

Вот несколько хороших кандидатов на роль 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

fico7489
источник
0

Обратите внимание на require-dev (только для root) !

это означает, что раздел require-dev действителен только в том случае, если ваш пакет является корнем всего проекта. Т.е. если ты бежишьcomposer update из своей папки пакета.

Если вы разрабатываете плагин для какого-то основного проекта, у которого есть собственный composer.json, тогда ваш раздел require-dev будет полностью проигнорирован! Если вам нужны зависимости от разработки, вы должны переместить файл require-dev в composer.json в основном проекте.

Orkan
источник