--no-dev 是生产环境降体积与耗时最直接手段,跳过 require-dev 包安装及 autoload-dev 注册,但需确保 lock 文件存在、dev 包无运行时依赖,并搭配 --no-interaction、--optimize-autoloader、--classmap-authoritative 使用。
生产环境执行 composer install 时加 --no-dev 是最直接、最有效的包体积与耗时双降手段,但仅加参数还不够——它只是开关,背后依赖 composer.json 的正确配置和部署流程的配合。
--no-dev 能显著提速?它跳过所有 require-dev 下声明的包(如 phpunit/phpunit、friendsofphp/php-cs-fixer、mockery/mockery),这些包通常不参与运行时逻辑,却常占总依赖量的 30%–60%。同时省去它们的自动加载注册、类映射生成、脚本执行等环节。
autoload-dev 注册 → vendor/autoload.php 更轻,classmap 文件更小
scripts 中标记为 dev 的钩子(如 post-autoload-dump)composer install --no-dev 的前提条件该命令只在已有 composer.lock 时才安全高效;若缺失 lock 文件,Composer 会退化为 composer update --no-dev,重新解析依赖并写入新 lock,这反而更慢且可能引入非预期变更。
composer.lock
composer.json 中的 require-dev 不能包含运行时必需的包(比如某些 SDK 的调试工具被误放 dev 区)config.autoload-dev 或手动 require 了 dev 包中的文件,加 --no-dev 会导致运行时报 Class not found
单用 --no-dev 不够,需搭配其他选项形成最小可信安装集:
composer install --no-dev --no-interaction --optimize-autoloader --classmap-authoritative
说明:
--no-interaction:禁用交互提示,避免卡在 yes/no 选择上(CI 环境必需)--optimize-autoloader:生成 classmap 加速类加载,跳过 PSR-4/PSR-0 动态查找--classmap-authoritative:告诉 autoloader “classmap 里没有的类就一定不存在”,彻底关闭文件系统扫描,进一步提速(Laravel 8+ / Symfony 5.3+ 默认启用)有些包在 require-dev 里“悄悄”提供了运行时能力,例如:
symfony/debug(旧版)被用于异常渲染,但已移入 require;若项目还锁在 v3.x 可能出问题doctrine/orm 的 dev 依赖中含 doctrine/doctrine-bundle,而后者在 Symfony 项目中是运行必需的 → 错误归类会导致 --no-dev 后报错laravel/sail 放在 require-dev 没问题,但若 docker-compose.yml 引用了其 PHP 镜像里的扩展,实际部署时可能缺失 ext-pdo_pgsql 等判断方式:本地执行 composer install --no-dev 后,运行 php -m 和 php artisan tinker(或对应框架 CLI),确认关键服务可启动、核心路由可响应。