生产环境必须加--no-dev,否则lock文件含dev包时会强制安装,导致体积膨胀、启动变慢、autoload冲突及调试入口暴露;config.dev=false可全局禁用dev包。

生产环境只要漏掉 --no-dev,就等于把 PHPUnit、PHPStan、var-dumper 全塞进 vendor/ ——不是“可能出问题”,是必然体积膨胀、启动变慢、autoload 冲突,甚至暴露调试入口。
为什么 composer install 默认不装 require-dev,但你还是得加 --no-dev
因为 composer install 的默认行为确实是跳过 require-dev,但它只在 composer.lock 文件本身不含 dev 包记录的前提下才可靠。一旦 lock 文件里存了 phpunit/phpunit 的版本信息(比如上次是 composer update 无参数生成的),composer install 就会照单全收——--no-dev 是唯一能强制过滤它的开关。
- 不加
--no-dev:哪怕composer.json里只有"require",只要 lock 文件有 dev 包,它们就会被解压进vendor/ - 加了
--no-dev:跳过所有require-dev声明 + 它们的传递依赖(如sebastian/exporter) +autoload-dev注册的命名空间 - CI/CD 中常见翻车点:脚本里写
make install,背后封装的是composer install,没透传--no-dev参数
autoload-dev 不是给 PHPUnit 用的,是给你自己的 tests/ 目录用的
autoload-dev 的作用很具体:当本地完整安装了 require-dev 包后,它把 tests/、stubs/ 这类路径加进自动加载规则,方便你写 use AppTestsFooTest。但它不负责让 PHPUnit 自己跑起来——那是 require-dev 里包的事。
- 如果你的测试类用了
MockeryMockInterface,除了mockery/mockery要在require-dev,还得确保autoload-dev包含"Tests\": "tests/" - 执行
composer dump-autoload --classmap-authoritative时,默认忽略autoload-dev;必须加--dev才生效 -
vendor/composer/autoload_dev.php这个文件,只要存在,就说明autoload-dev规则被生成过;生产镜像里必须删掉它,否则可能被某些框架条件加载
部署前必须验证的三件事
光写 --no-dev 不够,得看结果是否真正干净。别信命令行参数,信文件系统和 lock 文件。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 检查
vendor/:运行ls vendor/ | grep -E 'phpunit|phpstan|mockery|psalm|var-dumper',有输出就是没隔离成功 - 检查
composer.lock:搜索"name": "phpunit/phpunit",它只能出现在packages-dev或原始require-dev声明中,不能在packages数组里 - 检查 autoload 文件:确认
vendor/composer/autoload_dev.php不存在;若存在,说明dump-autoload没加--no-dev,或构建流程漏删
config.dev = false 是全局禁用 dev 包的硬开关
如果团队经常误装,或者你维护的是 SDK 类项目(自己不写测试),可以在 composer.json 的 config 段直接设死:
"config": {
"dev": false
}
这个配置会让所有 composer install 和 composer update 默认跳过 require-dev,等价于永远带 --no-dev。想临时装?得显式加 --dev。
- 它不影响
composer require --dev写入 JSON,只是不执行安装 - 比靠人记参数更可靠,尤其适合 CI 流水线或 Docker 构建环境
- 注意:某些旧版 Composer(1.x)不支持该配置,需升级到 2.2+
最常被忽略的一点:--no-dev 只控制包安装和 autoload 映射,不阻止代码里硬引用 dev 类。如果控制器里写了 dump($data),哪怕 symfony/var-dumper 在 require-dev,线上 debug 模式一开照样 500 —— 隔离依赖,不等于隔离逻辑。










