composer install --no-dev
Тема дорожной карты · PHP Developer
composer install --no-dev --optimize-autoloader — каноничная команда установки зависимостей PHP-приложения в продакшене. Флаг --no-dev исключает все пакеты из секции require-dev в composer.json (PHPUnit, PHPStan, симуляторы тестового окружения), сокращая объём vendor/ иногда в 2-3 раза и убирая инструментарий, которому в проде делать нечего. --optimize-autoloader (или -o) собирает classmap-автозагрузку, экономя десятки миллисекунд на каждый HTTP-запрос. Дополнительно используют --no-interaction --prefer-dist --classmap-authoritative для CI и Docker-сборок.
Как это работает
Composer читает composer.lock — снимок точных версий каждой зависимости с её хешем. install идёт строго по lock-файлу: без сетевых обращений к Packagist для разрешения версий, только скачивание уже зафиксированных архивов. --no-dev исключает граф require-dev, --optimize-autoloader дополнительно генерирует vendor/composer/autoload_classmap.php со всеми классами в одном массиве — PHP больше не сканирует файловую систему при первом обращении к классу. В Docker такую установку выполняют отдельным слоем до копирования исходного кода, чтобы кешировать vendor/ между сборками.
Когда применять
Всегда в продакшене: Dockerfile, ansible-плейбук, deploy-скрипт CI. Также — в staging, который должен повторять прод. В локальной разработке используют обычный composer install без флагов, чтобы получить PHPUnit и инструменты статанализа. На «тонкой» VPS с медленным диском пропуск --optimize-autoloader ощутимо бьёт по latency холодных запросов под PHP-FPM.
Типичные ошибки
Самая болезненная: коммит vendor/ в репозиторий — теряете воспроизводимость, раздуваете clone, мешаете composer audit. Вторая: запуск composer update на проде вместо install — update перечитывает Packagist и может подтянуть свежие минорные версии в обход lock-файла. Третья: забыть --classmap-authoritative в Docker-образах — PHP попадёт в режим fallback и начнёт сканировать vendor/ на runtime, ломая преимущество OPcache. Четвёртая, особенно коварная для Docker-сборок: устанавливают зависимости в одном слое, а копируют исходный код после, надеясь на кеш — но забывают зафиксировать конкретную версию PHP в базовом образе, и при пересборке через несколько недель composer install молча выбирает свежий бинарник с другими расширениями. Пятая: запуск composer install без флага --prefer-dist в CI без интернета — Composer падает на попытке клонировать пакет через git и собирает контейнер вручную минут пять. Поэтому в продакшн-пайплайне всегда явно передавайте оба флага одновременно.