composer install 默认走生产模式,即只安装 composer.lock 中 require 区块的包,跳过 require-dev 全部内容;不加 --dev 参数时不会安装 phpunit 等开发依赖,显式加 --dev 才启用测试包安装。

composer install 默认走什么模式?
默认就是生产模式——composer install 不加任何参数时,只安装 require 中的包,跳过 require-dev 里的全部内容。这不是“没指定就随便装”,而是明确按 lock 文件里记录的 production 依赖来装。
常见误解是“不加 --no-dev 就会装 dev 包”,其实反了:不加 --dev 才是安全的默认行为。只有显式加 --dev(或 -d)才会把 phpunit、php-cs-fixer 这类工具装进来。
- 本地跑测试失败?大概率是忘了加
composer install --dev - 线上报
Class 'PHPUnitFrameworkTestCase' not found?说明部署脚本漏了--no-dev,但更可能是 lock 文件里本来就有 dev 包记录 -
composer update默认也不碰require-dev,想升级 phpunit 必须加--dev
--no-dev 和 --dev 到底控制什么?
--no-dev 只影响「包是否被下载和解压到 vendor/」,不改变 autoload 规则本身;--dev 是显式开启 dev 包安装开关,不是“恢复默认”。
关键点在于:composer install --no-dev 不会读 autoload-dev 配置,也不会把对应路径写进 vendor/autoload.php;但如果你之前没清掉旧 autoload 文件,或者手动改过它,那 classmap 里可能还残留测试类路径——这时候即使没装 phpunit,也会因 autoload 冲突导致奇怪的 Class not found。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 测试阶段:用
composer install --dev,确保 mock 类、测试辅助函数可用 - Docker 构建生产镜像:必须写死
composer install --no-dev --optimize-autoloader --classmap-authoritative - 不要依赖环境变量如
COMPOSER_DEV_MODE=0,Composer 2.x 已彻底移除对该变量的支持
为什么加了 --no-dev 还有 dev 类报错?
根本原因通常有两个:lock 文件本身含 require-dev 包记录,或 vendor/autoload.php 没刷新。
比如你本地开发时运行过 composer update(默认含 dev),lock 文件就记下了 phpunit 的版本;之后部署时只跑 composer install --no-dev,但 lock 里有它,Composer 仍会装——--no-dev 此时失效。真正生效的前提是 lock 文件里没有 dev 包条目。
- 修复方法:CI 构建前先执行
composer update --no-dev --lock,提交新 lock - 补救措施:部署后立刻跑
composer dump-autoload --no-dev,删掉 autoload-dev 映射 - 检查手段:
composer show --dev看当前 vendor 里实际装了哪些 dev 包
autoload-dev 和 require-dev 是两回事
require-dev 声明的是“哪些包要装”,autoload-dev 声明的是“哪些路径在 dev 模式下可自动加载”。两者不绑定,也不互相触发。
举例:你在 autoload-dev 里写了 "App\Test\": "tests/",但没把 phpunit/phpunit 放进 require-dev ——那 tests/ 下的类根本不会被加载,因为 PHPUnit 自身都没装。反过来,如果某个包只在 require-dev 里,但它的类被 src/ 里的控制器 new 出来了,上线就会崩,哪怕你加了 --no-dev。
- 判断一个包能不能放
require-dev,唯一标准是:grep -r "vendor/name" src/ 结果为空 -
symfony/var-dumper放require-dev很常见,但如果代码里写了dump($data)且该代码路径在线上可被执行,它就得挪回require - 框架层(如 Laravel)有时会在服务提供者里条件加载 dev 工具,务必用
class_exists()包一层,否则--no-dev下直接 fatal error










