У чому різниця між розділами require та require-dev у composer.json?


99

Я починаю використовувати композитор, я так мало про це знаю і маю невеликий досвід у розробці веб-додатків.

Я просто проходжусь по підручнику Nettuts + , тому у мене є основне запитання про композитора.

{
  "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"участь? Це тому, що ми хочемо отримати конкретну версію пакету, а не завжди отримувати останню стабільну версію?

Відповіді:


115

Різні середовища

Як правило, програмне забезпечення буде працювати в різних середовищах:

  • 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залежності.

Однак у середовищах stagingand productionсередовищах ви хочете встановити лише залежності, необхідні для запуску програми, а як частину процесу розгортання ви зазвичай запускаєте

$ composer install --no-dev

встановлювати лише productionзалежності.

Семантика

Іншими словами, розділи

  • require
  • require-dev

вкажіть, composerякі пакети слід встановлювати під час запуску

$ composer install

або

$ composer install --no-dev

Це все.

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

Для довідки див .:


Чи правильно я розумію, що взагалі неважливо, чи я "розгортаю", завантажуючи всю vendorпапку через FTP?
пілат

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

61
  1. Згідно з керівництвом композитора :

    require-dev (лише root)

    Перелічує пакети, необхідні для розробки цього пакета, або запуску тестів тощо. Вимоги розробника до кореневого пакета встановлюються за замовчуванням. Обидва installабо updateпідтримують --no-devопцію, яка запобігає встановленню залежностей розробника.

    Тож запуск composer installтакож завантажить залежності розвитку.

  2. Причина насправді досить проста. Спілкуючись із певною бібліотекою, ви можете запустити тестові набори або інші засоби розробки (наприклад, symfony). Але якщо ви встановите цю бібліотеку до проекту, ці залежності від розробки можуть не знадобитися: не кожен проект вимагає запуску тесту.


19

З сайту композитора (це досить зрозуміло)

вимагати #

Список пакунків, необхідних для цього пакета. Пакет не буде встановлений, якщо ці вимоги не будуть дотримані.

require-dev (лише для кореневої системи) #

Перелічує пакети, необхідні для розробки цього пакета, або запуску тестів тощо. Вимоги розробника до кореневого пакета встановлюються за замовчуванням. І установка, і оновлення підтримують опцію --no-dev, яка запобігає встановленню залежностей розробника.

Використовуючи require-dev у Composer, ви можете заявити про залежності, необхідні для розробки / тестування проекту, але не потрібні у виробництві. Коли ви завантажуєте проект на робочий сервер (за допомогою git)require-dev частина буде проігнорована.

Також перевірте цю відповідь, розміщену автором, а також цю публікацію .


3
Поясніть, будь ласка, чому "шлях / генератори": "dev-master" знаходиться в розділі "вимагати" ?, мені це більше не знадобиться у виробництві.
Artisan

1
Це загальна здогадка, але єдине, про що я можу придумати, це те, що оскільки шлях / генератори додаються як постачальник послуг, якщо він відсутній у виробничому середовищі, Laravel не працюватиме.
Деніел Холлендс

2
Частина Вимоги dev до кореневого пакета встановлюються за замовчуванням, чітко вказує, що залежності від require-dev встановлюються навіть на робочому сервері.
Gemmu

3
Ідея полягає в тому, що ви б використовували прапор --no-dev для виробництва.
Джон Панкост,

2

розділ вимагати Цей розділ містить пакети / залежності, які є кращими кандидатами для встановлення / необхідності у виробничому середовищі.

розділ require-dev: Цей розділ містить пакети / залежності, які розробник може використовувати для тестування свого коду (або для експериментів на своїй локальній машині, і вона не хоче, щоб ці пакунки встановлювалися у виробничому середовищі).


1

Загальне правило полягає в тому, що вам потрібні пакети з require-dev розділу лише в середовищах розробки (dev), наприклад, у локальному середовищі.

Пакети в розділі require-dev - це пакети, які допомагають вам налагоджувати програми, запускати тести тощо.

У проміжному та виробничому середовищі ви, мабуть, хочете лише пакети з розділу вимагати .

Але в будь-якому випадку ви можете запустити composer install --no-dev та composer update --no-dev у будь-якому середовищі, команда встановить лише пакети з необхідного розділу, а не з require-dev , але, ймовірно, ви хочете запустити це лише на етапі підготовки та виробництва середовища не на локальному.

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

  1. швидкість
  2. потенціал розкриття інформації про налагодження
  3. тощо

Деякі хороші кандидати для розробника :

"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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.