--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%。同时省去它们的自动加载注册、类映射生成、脚本执行等环节。
- 不下载、不解压、不安装 dev 包 → 减少 I/O 和网络耗时
- 跳过
autoload-dev注册 →vendor/autoload.php更轻,classmap文件更小 - 避免执行
scripts中标记为dev的钩子(如post-autoload-dump)
composer install --no-dev 的前提条件
该命令只在已有 composer.lock 时才安全高效;若缺失 lock 文件,Composer 会退化为 composer update --no-dev,重新解析依赖并写入新 lock,这反而更慢且可能引入非预期变更。
- 必须确保 CI/CD 或构建机上已存在稳定、已验证的
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),确认关键服务可启动、核心路由可响应。










