答案是:composer install 不支持只装 require-dev 中的部分包,必须用 composer require --dev 单独安装;生产环境必须加 --no-dev,否则会引入冗余包和 autoload 风险。

composer install 本身不支持“只装 require-dev 里的某几个包”——它只有全装或全不装两种模式。 想单独装 PHPUnit 或 Pest 这类测试包,得用 composer require --dev,而不是靠 install 命令筛选。
composer install --no-dev 是上线必加的开关
本地开发时,composer install 默认会装 require 和 require-dev 里的所有包。但生产环境必须加 --no-dev,否则:
-
vendor/phpunit/这类目录会被一并复制进去,增大镜像体积、拖慢启动 - 如果某处代码(比如 CI 脚本)硬写了
new TestsMyTest(),而autoload-dev又没被清理,就会在生产环境直接报Class 'TestsMyTest' not found -
composer dump-autoload不加--no-dev,生成的vendor/autoload.php里仍保留"Tests\": "tests/"这类映射,哪怕没装包也会触发 autoload 查找失败
想临时装某个 dev 包?别用 install,用 require --dev
比如要加 Pest 测试框架,正确做法是:
composer require --dev pestphp/pest
这条命令会:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把
pestphp/pest写进composer.json的require-dev字段 - 立刻下载安装,并注册它的 autoloader(含
autoload-dev规则) - 不会动
require里的任何包,也不影响已有依赖版本
反例:composer install --dev 并不存在;composer install 加了 --dev 参数会被忽略,它只认 --no-dev。
require-dev 里的包不是“自动隔离”的
很多人以为只要放进 require-dev,就天然只能在测试里用——其实不是。关键看两点:
- 有没有在
src/或app/目录下的代码里use或new过它的类(比如误把symfony/var-dumper的dump()写进控制器) - 有没有在
autoload-dev里注册了测试路径,又在非测试上下文(比如部署脚本)里试图加载Tests\*类
真正安全的做法是:把 tests/ 目录彻底从 autoload 和 autoload-dev 中移除,只让 PHPUnit 自己的 autoloader 加载测试类——否则哪怕加了 --no-dev,也挡不住运行时类查找失败。
最易被忽略的点是:autoload-dev 的路径映射和 require-dev 的包安装是两件事。删掉包,不等于删掉自动加载规则;加了 --no-dev,也不等于清掉了 vendor/autoload.php 里的测试路径映射。上线前务必跑一遍 composer dump-autoload --no-dev。

















