require-dev 是开发环境依赖的强制区分手段,生产环境必须用 composer install --no-dev 排除,否则会导致构建变慢、安全风险和版本冲突。

require-dev 是专门用来放开发环境依赖的,不是可选项,是必须用的区分手段。生产环境不装它们,不是靠删配置,而是靠命令参数控制。
为什么不能把 dev 包塞进 require
硬塞进去会导致三个实际问题:
- 生产部署时
composer install会照单全收,白装一堆 phpunit、php-cs-fixer,拖慢构建、增大镜像体积 - 某些 dev 包(如
barryvdh/laravel-debugbar)可能在运行时自动启用,暴露调试接口,构成安全风险 - 如果某个包同时被
require和require-dev引用,Composer 会按更严格的版本约束解析——你本想线上用^2.0,结果因 dev 里写了^3.0,整个项目被迫升版,引发兼容性断裂
composer install --no-dev 必须出现在所有生产环节
这个参数不是“建议加”,是上线流程里的硬性守门员。漏掉它,CI/CD 流水线、Docker 构建、K8s 部署都会出问题:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 脚本写
composer install却没加--no-dev→ 测试阶段能跑,但浪费资源装了不该装的包,还可能因扩展缺失(如缺少ext-xdebug)直接失败 - Dockerfile 里用
composer install --optimize-autoloader却忘了--no-dev→ 镜像里多出几十 MB 的 vendor 冗余,且 autoload 映射里混入测试命名空间,影响性能 - 本地
composer update没加--with-dependencies→ 更新一个phpunit/phpunit时,它的子依赖(比如sebastian/exporter)卡在旧版,运行测试时抛Class not found
autoload-dev 不等于自动生效
很多包(如 PHPUnit 扩展)在 require-dev 里声明了 autoload-dev 规则,但这只在你装了它之后才起作用。一旦用了 --no-dev,这些规则就完全不加载:
- 代码里如果写了
new \Tests\FooTest(),而Tests\命名空间只定义在autoload-dev里 → 运行时报Class not found,不是 Composer 错,是你逻辑越界了 -
vendor/autoload.php是统一入口,它不会根据是否装了 dev 包动态切换加载规则;autoload-dev只参与composer dump-autoload生成过程,不参与运行时条件判断 - 误删
vendor/autoload.php后只执行composer dump-autoload→ 它不会恢复文件,也不会重装包,必须先composer install或composer update
最常被忽略的一点:dev 依赖的版本约束和 require 完全等效,支持 ^、~、dev-main,但它们的“存在感”只在你执行命令时才被触发——不是写进 composer.json 就自动生效,也不是不写就安全,关键在安装那一刻的参数选择。










