必须用 composer require --dev(或兼容的 -D),否则包会进 require 字段,上线后可能报 Class not found 或引发安全风险;旧版 Composer 不支持 --dev,需升级或改用 -D,且命令顺序错误(如 phpunit/phpunit --dev)也会被忽略。

必须用 composer require --dev(或兼容的 -D),否则包会进 require 字段,上线后可能报 Class not found 或引发安全风险。
为什么 composer require --dev 有时不生效?
旧版 Composer(--dev,只认短参数 -D;而命令顺序错也会失效——composer require phpunit/phpunit --dev 中 --dev 写在最后会被忽略。
- ✅ 正确写法:
composer require --dev phpunit/phpunit(Composer ≥2.2)或composer require -D phpunit/phpunit(全版本兼容) - ❌ 错误写法:
composer require phpunit/phpunit --dev、composer require --dev(漏包名)、composer require-dev(不存在该子命令) - 检查是否生效:运行
composer show | grep phpunit,输出应只有 1 行,且不含required by your-project这类提示(说明没被主项目 autoload 引用)
require-dev 里的包,为什么生产环境还能加载到?
不是 Composer 没过滤,而是两个常见配置漏洞让 dev 包“意外泄漏”:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"autoload-dev"配置了不该暴露的路径,比如把tests/和src/同时注册,导致测试辅助类被生产 autoloader 加载 - 部署时漏了
--no-dev,composer install默认仍会装require-dev下所有包——Laravel 的APP_ENV=production对此毫无影响 - CI 流水线中,构建镜像前没重跑
composer install --no-dev --optimize-autoloader,镜像里就带着phpunit和debugbar
误加到 require 怎么快速修正?
别删 composer.json 再重装,容易触发依赖回滚或版本漂移。直接用 Composer 自带的清理逻辑更稳:
- 先手动从
composer.json的require块里删掉那行(如"phpunit/phpunit": "^10") - 再执行
composer update phpunit/phpunit—— 因为它已不在require,这次 update 会把它从vendor/彻底移除 - 最后补上:
composer require --dev phpunit/phpunit:^10 - 验证:
composer show phpunit/phpunit应显示type: library,且requires列为空(不依赖你项目)
真正难处理的不是加错位置,而是 autoload-dev 和部署脚本里混用 composer install 与 composer update——前者依赖 composer.lock,后者绕过它。一个没注意,dev 包就进了生产镜像,还查不出源头。

















