Composer имеет возможность загружать несколько зависимостей только в процессе разработки, поэтому инструменты не будут установлены в производственной среде (на работающем сервере). Это (теоретически) очень удобно для сценариев, которые имеют смысл только при разработке, таких как тесты, fake-data-tools, отладчик и т. Д.
Для этого нужно добавить дополнительный require-dev
блок с инструментами, которые вам нужны в dev:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
а затем (теоретически) загрузить эти зависимости через
composer install --dev
Проблема и вопрос:
Composer изменил поведение install
и update
в 2013 году резко изменил require-dev
-dependencies (!), Не стесняйтесь создавать composer.json с require-dev
блоком и выполнять composer install
воспроизведение для воспроизведения.
Как наиболее приемлемый способ развертывания, это нажать композитора. Блокировка (которая содержит ваши текущие настройки композитора), а затем выполнить composer install
на рабочем сервере, это также установит материал для разработки.
Как правильно развернуть это, не устанавливая зависимости -dev?
Примечание: я пытаюсь создать канонический Q / A здесь, чтобы прояснить странное развертывание Composer. Не стесняйтесь редактировать этот вопрос.
composer.lock
Никогда не должны быть добавлены в репозиторий Git, НИКОГДА. Правильный подход состоит в том, чтобы использовать обновление композитора при подготовке и затем синхронизировать файл в производство (если все работает, конечно). Постановка должна быть точной копией производственной среды.composer.lock
должен быть частью.gitignore
.Ответы:
Зачем
ИМХО есть веская причина, почему Composer в настоящее время будет использовать этот
--dev
флаг по умолчанию (при установке и обновлении). Composer в основном запускается в сценариях, где это желаемое поведение:Основной рабочий процесс Composer выглядит следующим образом:
composer.phar install --dev
файлы JSON и Lock передаются в VCS.composer.phar install --dev
.composer.phar require <package>
добавить--dev
если хотите, пакет вrequire-dev
разделе (и подтвердите).composer.phar install --dev
.composer.phar update --dev <package>
(и коммит).composer.phar install --dev
.composer.phar install --no-dev
Как вы можете видеть
--dev
флаг используется (гораздо) больше, чем--no-dev
флаг, особенно когда число разработчиков, работающих над проектом, растет.Развертывание производства
Ну
composer.json
иcomposer.lock
файл должен быть зафиксирован в VCS. Не опускайтеcomposer.lock
потому что он содержит важную информацию о версиях пакетов, которые следует использовать.При выполнении производственного развертывания вы можете передать
--no-dev
флаг Composer:composer.lock
Файл может содержать информацию о Dev-пакетах. Это не важно--no-dev
Флаг будет убедиться , что эти DEV-пакеты не установлены.Когда я говорю «развертывание производства», я имею в виду развертывание, нацеленное на использование в производстве. Я не спорю,
composer.phar install
следует ли делать это на рабочем сервере или на промежуточном сервере, где можно что-то проверить. Это не предмет этого ответа. Я просто указываю, какcomposer.phar install
без установки "dev" зависимостей.Не по теме
--optimize-autoloader
Флаг может быть также желателен на производстве (он генерирует класс-карту , которая ускорит самозарядную в приложении):Или когда автоматическое развертывание выполнено:
Если кодовая поддерживает это, вы могли бы поменять
--optimize-autoloader
на--classmap-authoritative
. Больше информации здесьисточник
--optimize-autoloader
. Также обратите внимание:--classmap-authoritative
из документации по getcomposer.org/doc/03-cli.md вы можете увидеть это: «Автозагрузка классов только из карты классов. Неявно включает --optimize-autoloader, так что вы можете использовать, если вы знаете, что классы» там ", что, вероятно, должно произойти в вашей среде prod, если вы не генерируете классы динамически.optimize-autoloader
прямо вcomposer.json
:{"config": { "optimize-autoloader": true } }
На самом деле, я очень рекомендую ПРОТИВ установки зависимостей на рабочий сервер.
Моя рекомендация состоит в том, чтобы извлечь код на компьютере развертывания, установить необходимые зависимости (это НЕ включает установку зависимостей dev, если код поступает в производство), а затем переместить все файлы на целевой компьютер.
Зачем?
composer install
Короче говоря: используйте Composer в среде, которой вы можете управлять. Ваша машина разработки действительно подходит, потому что у вас уже есть все, что необходимо для работы Composer.
Команда для использования
Это будет работать в любой среде, будь то сам рабочий сервер, или машина развертывания, или машина разработки, которая должна выполнить последнюю проверку, чтобы определить, правильно ли используется какое-либо требование dev для реального программного обеспечения.
Команда не будет устанавливать или активно удалять требования dev, объявленные в файле composer.lock.
Если вы не возражаете против развертывания компонентов программного обеспечения для разработки на производственном сервере, запуск
composer install
будет выполнять ту же работу, но просто увеличит количество перемещаемых байтов, а также создаст большее объявление автозагрузчика.источник
app-1.34.phar
т. Д.). Существует отдельный механизм, который уведомляет и решает, когда захватить этот файл, куда передать его и что с ним делать. Некоторые команды предпочитают распаковывать phar, когда он находится на сервере, а некоторые команды запускают его как есть. Это придает большую уверенность стабильности и воспроизводимости наших развертываний.Теперь
require-dev
включен по умолчанию, для локальной разработки вы можете обойтисьcomposer install
иcomposer update
без--dev
опции.Когда вы хотите развернуть в производство, вы должны убедиться, что
composer.lock
нет пакетов, которые пришлиrequire-dev
.Вы можете сделать это с
Как только вы проверили локально с
--no-dev
вы можете развернуть все для производства и установки на основеcomposer.lock
. Здесь вам--no-dev
снова понадобится опция, в противном случае композитор скажет: «Файл блокировки не содержит информацию о require-dev» .Примечание: будьте осторожны со всем, что может привести к различиям между разработкой и производством! Обычно я стараюсь избегать require-dev везде, где это возможно, поскольку включение инструментов dev не требует больших затрат.
источник
composer.lock
зависимости dev. Вы просто запуститеcomposer install --no-dev
, и вы получите только установленные регулярные зависимости - фактически, Composer также удалит все зависимости dev на этом шаге.composer.lock
были зависимости dev (и это могло повлиять на версии пакетов не dev), я бы хотел обновить его, чтобы отразить, как он будет работать. Это также заставляет вас запускатьсяcomposer install --no-dev
в производство, какcomposer install
и ошибка. Технически я думаю, что ты прав; это не обязательно, но это дополнительный уровень безопасности, который мне нравится.dev/tool
иprod/lib:~1.0
. Новейшая версия prod / lib - 1.3, но также требуется dev / toolprod/lib:1.1.*
. Результат: вы установите версию 1.1.9 (новейшую ветку 1.1.x) и будете использовать ее во время разработки. Я бы сказал, что просто обновлять НЕ безопасно--no-dev
, поэтому включите новейшую версию prod / lib 1.3 и предположите, что все работает без тестирования. А может быть, тогда тестирование невозможно из-за отсутствия dev / tool. Я бы предположил, что, поскольку dev / tool не нужен в производственной среде, его не следует развертывать, но тогда программное обеспечение должно использовать prod / lib 1.1.9.--no-dev
то вам нужно проверить его локально, как я уже упоминал в ответе. Я все еще рекомендовал бы вообще не использовать--no-dev
.composer update
затем сделайте некоторую разработку, затем сделайтеcomposer update --no-dev
, затем проведите тестирование релиза, затем перейдите к производству и выполнитеcomposer install --no-dev
. Две проблемы: 1. Я не могу протестировать релиз без dev-зависимостей, и 2. Я не могу установить, например, с Git на производстве.На производственных серверах я переименую
vendor
вvendor-<datetime>
, и во время развертывания будет иметь два поставщик каталоги.Файл cookie HTTP заставляет мою систему выбирать нового поставщика
autoload.php
, и после тестирования я делаю полностью атомарный / мгновенный переход между ними, чтобы отключить старый каталог поставщиков для всех будущих запросов, а затем удаляю предыдущий каталог несколькими днями позже.Это позволяет избежать любой проблемы, вызванной кэшем файловой системы, который я использую в apache / php, а также позволяет любому активному PHP-коду продолжать использовать каталог предыдущего поставщика.
Несмотря на другие ответы, рекомендующие против, я лично запускаю
composer install
на сервере, так как это быстрее, чем rsync из моей области подготовки (виртуальная машина на моем ноутбуке).Я использую
--no-dev --no-scripts --optimize-autoloader
. Вы должны прочитать документы для каждого из них, чтобы проверить, подходит ли это для вашей среды.источник
Я думаю, лучше автоматизировать процесс:
Добавьте файл composer.lock в ваш репозиторий git, убедитесь, что вы используете composer.phar install --no-dev когда вы выпускаете, но на вашем компьютере разработчика вы можете использовать любую команду composer без проблем, это не пойдет на работу, производство будет основывать свои зависимости в файле блокировки.
На сервере вы извлекаете эту конкретную версию или метку и запускаете все тесты, прежде чем заменять приложение. Если тесты пройдены, вы продолжаете развертывание.
Если тест зависит от dev-зависимостей, так как у composer нет зависимости от области действия теста, не слишком элегантное решение может быть выполнением теста с dev-зависимостями ( composer.phar install ), удалить библиотеку вендора, запустить composer.phar install - -по-DEV Опять , это будет использовать кэшированные зависимости, поэтому быстрее. Но это хак, если вы знаете концепцию областей действия в других инструментах сборки
Автоматизируй это и забудь обо всем остальном, иди выпей пива :-)
PS: Как и в комментарии @Sven ниже, не очень хорошая идея не извлекать файл composer.lock, потому что это заставит установку composer работать как обновление composer.
Вы можете сделать это с помощью http://deployer.org/ это простой инструмент.
источник
composer.lock
заставитcomposer install
действовать какcomposer update
. Таким образом, версии, которые вы развертываете, не те, с которыми вы разработали. Это может вызвать проблемы (и особенно в свете единственной недавно решенной проблемы безопасности с «заменой» в Composer). Вы никогда не должны запускатьсяcomposer update
без присмотра, не убедившись, что он ничего не сломал.