必须加 --dev,否则包被写入 require 字段导致线上 --no-dev 时缺失;--dev 写入 require-dev,默认安装,--no-dev 完全忽略;临时启用需 composer install --dev 且 composer.json 中存在该依赖。

安装 dev 依赖时 composer require 必须加 --dev
不加 --dev,包会被写入 require 字段,上线部署时也会被安装,这违背 dev 依赖的设计初衷。只有显式加上 --dev,Composer 才会把包写进 require-dev,并默认跳过 composer install --no-dev 的安装流程。
常见错误现象:本地跑测试没问题,CI 或线上环境却报 Class not found —— 很可能是因为你漏了 --dev,导致测试工具(比如 phpunit/phpunit)进了生产依赖,而线上执行了 --no-dev,实际没装上。
-
composer require phpunit/phpunit --dev:正确,写入require-dev -
composer require phpunit/phpunit:错误,写入require,污染生产依赖 -
composer require --dev friendsofphp/php-cs-fixer:适合本地代码规范检查,上线不需
composer install 默认是否安装 dev 依赖?
是的,默认行为就是安装 require-dev 中的所有包。但只要加了 --no-dev,Composer 就完全忽略 require-dev 字段,连解析都跳过,性能略优,也更安全。
典型使用场景:
- CI/CD 流水线中:用
composer install --no-dev --optimize-autoloader加速构建、减小镜像体积 - Docker 生产镜像:避免打包
phpunit、fakerphp/faker这类非运行时必需的包 - 共享主机或内存受限环境:减少 autoload 映射数量,降低 PHP 内存占用
如何临时启用 dev 依赖而不改 composer.json?
不能。Composer 不支持运行时“开关”dev 依赖 —— require-dev 是声明式配置,必须存在于 composer.json 中才会被识别。但你可以用 composer install --dev 强制安装(即使当前 composer.lock 是按 --no-dev 生成的),前提是 composer.json 里确实有 require-dev 条目。
注意两个易错点:
- 如果
composer.lock是别人用--no-dev提交的,你本地执行composer install(无参数)仍不会装 dev 包,因为 lock 文件已锁定不含 dev 的依赖树 - 此时需先删掉
composer.lock,再运行composer install,或直接composer update --lock刷新 lock 文件
dev 依赖会影响自动加载性能吗?
会,但只在开发环境生效。所有 require-dev 中的包都会被加入 Composer 的 autoloader 映射(vendor/autoload.php),哪怕你从不 use 它们。这意味着:
- PHP 启动时要多解析几十甚至上百个 PSR-4/PSR-0 映射规则
-
composer dump-autoload --optimize会把这些映射固化为静态数组,但总量仍在 - 若 dev 依赖中包含大型工具(如
symfony/console、laravel/framework的测试扩展),autoload 文件体积可能明显增大
真正该警惕的是:把本该是 dev 的包误放到了 require —— 比如把 monolog/monolog 当日志库用,却因疏忽加了 --dev,结果线上根本打不了日志。










