必须加 –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 条目。