Composer имеет возможность загружать несколько зависимостей только при разработке, поэтому инструменты не будут установлены в процессе производства (на реальном сервере). Это (теоретически) очень удобно для скриптов, которые имеют смысл только в разработке, таких как тесты, поддельные инструменты данных, отладчик и т. Д.
Для этого нужно добавить дополнительный блок require-dev с инструментами, которые вам нужны в dev:
"require-dev": { "codeception/codeception": "1.6.0.3" }
и затем (теоретически) загружать эти зависимости через
composer install --dev
Composer сильно изменил поведение install и update в 2013 году. require-dev -dependencies теперь установлены по умолчанию (!), Не стесняйтесь создавать композитор.json с блоком require-dev и выполнять composer install для воспроизведения.
Наиболее распространенным способом развертывания является продвижение композитора. lock (который содержит текущую настройку композитора), а затем composer install на производственном сервере, это также установит материал для разработки.
Каков правильный способ развертывания без установки зависимостей -dev?
Примечание. Я пытаюсь создать канонический Q / A здесь, чтобы прояснить странное развертывание Composer. Не стесняйтесь редактировать этот вопрос.
Зачем
ИМХО есть веская причина, по которой Composer будет использовать флаг --dev по умолчанию (при установке и обновлении) в настоящее время. Композитор в основном запускается в сценарии, где это желаемое поведение:
Основной рабочий процесс Composer выглядит следующим образом:
composer.phar install --dev новый проект: composer.phar install --dev , json и файлы блокировки передаются в VCS. composer.phar install --dev . composer.phar require <package> , add --dev если вы хотите пакет в разделе require-dev (и commit). composer.phar install --dev . composer.phar update --dev <package> (и commit). composer.phar install --dev . composer.phar install --no-dev Как вы можете видеть, флаг --dev используется (далеко) больше, чем флаг --no-dev , особенно когда число разработчиков, работающих над проектом, растет.
Производственное развертывание
Каков правильный способ развертывания без установки зависимостей «dev»?
Ну, файл composer.json и composer.lock должен быть привязан к VCS. Не опускайте composer.lock потому что он содержит важную информацию о версиях пакетов, которые следует использовать.
При выполнении развертывания производства вы можете передать флаг --no-dev в Composer:
composer.phar install --no-dev
Файл composer.lock может содержать информацию об dev-пакетах. Это не имеет значения. Флаг --no-dev гарантирует, что эти dev-пакеты не установлены.
Когда я говорю «развертывание производства», я имею в виду развертывание, которое предназначено для использования в производстве. Я не утверждаю, должна ли composer.phar install быть сделана на производственном сервере или на промежуточном сервере, где все может быть пересмотрено. Это не вопрос ответа. Я просто указываю, как composer.phar install без установки зависимостей «dev».
Не по теме
Флаг --optimize-autoloader также может быть желательным при производстве (он генерирует карту классов, которая ускорит автозагрузку в вашем приложении):
composer.phar install --no-dev --optimize-autoloader
Или при автоматическом развертывании:
composer.phar install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader
Моя рекомендация – проверить код на машине развертывания, установить зависимости по мере необходимости (это включает НЕ установку зависимостей dev, если код идет на производство), а затем переместить все файлы на целевую машину.
Зачем?
composer install Короче говоря: используйте Composer в среде, которую вы можете контролировать. Ваша машина разработки действительно подходит, потому что у вас уже есть все, что необходимо для работы с Composer.
Каков правильный способ развертывания без установки зависимостей -dev?
Используемая команда
composer install --no-dev
Это будет работать в любой среде, будь то сам производственный сервер или машина развертывания, или машина разработки, которая должна выполнить последнюю проверку, чтобы определить, неправильно ли используется какое-либо требование разработчика для реального программного обеспечения.
Команда не будет устанавливать или активно удалять требования разработчика, указанные в файле composer.lock.
Если вы не возражаете развертывать компоненты программного обеспечения разработки на рабочем сервере, работа с composer install будет выполнять ту же работу, но просто увеличит количество перемещенных байтов, а также создаст более крупную декларацию автозагрузчика.
Я думаю, что лучше автоматизировать процесс:
Добавьте файл composer.lock в репозиторий git, убедитесь, что вы используете installer.phar install –no-dev при выпуске, но в вашей машине dev вы можете использовать любую композицию композитора без проблем, это не приведет к производству, производство будет основывать свои зависимости в файле блокировки.
На сервере вы проверяете эту конкретную версию или метку и запускаете все тесты перед заменой приложения, если тесты проходят, вы продолжаете развертывание.
Если тест зависит от зависимостей между разработчиками, поскольку у композитора нет зависимости от тестовой области, малое изящное решение могло бы запускать тест с зависимостями dev ( компоновщик компоновщика ), удалить библиотеку поставщиков, запустить composer.phar – install –no-dev снова, это будет использовать кэшированные зависимости, поэтому это происходит быстрее. Но это взломать, если вы знаете концепцию областей в других инструментах построения
Автоматизируйте это и забудьте все остальное, выпейте пиво 🙂
PS: Как и в следующем комментарии @Sven, неплохо не проверять файл composer.lock, потому что это сделает установку композитора как обновление композитора.
Вы можете сделать эту автоматизацию с помощью http://deployer.org/, это простой инструмент.
Теперь require-dev включен по умолчанию, для локальной разработки вы можете выполнить composer install composer update и composer update без опции --dev .
Если вы хотите развернуть их на производство, вам нужно убедиться, что у composer.lock нет пакетов, которые поставляются с require-dev .
Вы можете сделать это с помощью
composer update --no-dev
После того, как вы проверили локально с помощью --no-dev вы можете развернуть все на производство и установить на основе composer.lock . Вам снова понадобится опция --no-dev , иначе композитор скажет: «Файл блокировки не содержит информацию о требовании-dev» .
composer install --no-dev
Примечание. Будьте осторожны с тем, что может вносить различия между разработчиками и производителями! Обычно я стараюсь избегать require-dev, где это возможно, поскольку включение инструментов dev не является большим накладным расходами.
На производственных серверах я переименую vendor в vendor-<datetime> , и во время развертывания будет два поставщика.
HTTP-файл cookie заставляет мою систему выбирать нового поставщика autoload.php , и после тестирования я делаю полностью атомный / мгновенный переключатель между ними, чтобы отключить старый каталог поставщика для всех будущих запросов, после чего я удаляю предыдущий каталог через несколько дней.
Это позволяет избежать любой проблемы, вызванной кэшами файловой системы, которые я использую в apache / php, а также позволяет любому активному PHP-коду продолжать использовать предыдущий каталог поставщика.
Несмотря на другие рекомендации, рекомендующие это, я лично запускаю composer install на сервере, поскольку это быстрее, чем rsync из моей промежуточной области (виртуальная машина на моем ноутбуке).
Я использую --no-dev --no-scripts --optimize-autoloader . Вы должны прочитать документы для каждого из них, чтобы проверить, подходит ли это для вашей среды.