composer install --no-dev 才是正解,它跳过 require-dev 包的安装、忽略 autoload-dev 注册、不生成 dev 相关 autoload 映射;而 --optimize-autoloader 仅优化加载,不跳过 dev 包。

Composer 默认会装 dev 依赖,但上线环境不需要 —— 直接加 --no-dev 就行,别用 install --optimize-autoloader 代替它,那俩不等价。
为什么 composer install --no-dev 才是正解
很多人以为 composer install -o(即 --optimize-autoloader)能跳过 dev 包,其实它只是加速自动加载,require-dev 里的包照装不误。真正过滤依赖的开关只有 --no-dev。
这个参数会:
- 跳过
require-dev字段中所有包的下载和安装 - 忽略
autoload-dev的注册(不影响运行时,只影响开发期类加载) - 不生成
vendor/autoload_static.php中的 dev 相关映射
composer install 和 composer update 都要加 --no-dev 吗
要看场景:
- 线上部署用
composer install --no-dev:基于现有composer.lock安装,安全、可复现 -
composer update --no-dev仅在 CI/CD 中需要更新生产依赖时用,日常开发不用;它会修改composer.lock,且依然跳过 dev 包 - 千万别在生产机上跑
composer update不带--no-dev,哪怕只是临时调试 —— 一不小心就装进phpunit或laravel/pint
常见错误现象和坑
这些表现基本都指向漏了 --no-dev:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 部署后报错:
Class 'PHPUnit\Framework\TestCase' not found—— 说明phpunit被装进生产环境了 -
vendor/bin下出现phpcs、psalm、pest等非运行时工具 —— 它们本不该存在 - Docker 构建体积比预期大 20MB+ —— 很可能是
symfony/var-dumper或barryvdh/laravel-debugbar这类 dev-only 包混进来了 -
composer show列出一堆你没在require里声明的包 —— 检查是不是require-dev泄露了
CI/CD 和 Docker 中的典型写法
不是所有环境都默认走 install,得显式写清楚:
composer install --no-interaction --no-dev --optimize-autoloader
注意顺序无关紧要,但三个参数建议一起用:
-
--no-interaction:避免交互卡住自动化流程 -
--no-dev:核心过滤动作 -
--optimize-autoloader:提升加载性能,和--no-dev是互补关系,不是替代关系
如果用了 COMPOSER_NO_INTERACTION=1 环境变量,仍需保留 --no-dev,变量不控制依赖范围。
dev 依赖不会被自动“识别”为非生产组件,Composer 不做智能判断 —— 它只认配置字段和命令参数。少打两个字,就可能让 roave/security-advisories 这种只该在 CI 里跑的包,跟着一起进生产容器。










