composer install –no-dev 仅跳过安装 require-dev 包,但不清理 composer.lock 中已存在的 dev 依赖;若 lock 文件含 dev 包,则仍会安装——需配合 –no-dev 首次生成 clean lock 或用 update –no-dev 彻底移除。
只安装生产环境依赖,就用 composer install --no-dev,但它的行为取决于当前 composer.lock 文件是否已存在、是否由带 --dev 的命令生成,以及你有没有手动删过 dev 相关字段 —— 很多“没生效”的问题其实出在这儿。
为什么 composer install --no-dev 有时像没加参数?
根本原因:这个参数只控制「是否安装 require-dev 里的包」,但它不修改 vendor/autoload.php 的自动加载逻辑,也不影响 composer.lock 中已记录的 dev 包。如果你之前运行过 composer install(无参数)或 composer update,composer.lock 里很可能已经存了 require-dev 的包信息,此时再加 --no-dev,Composer 会照着 lock 文件“精准还原”,包括那些 dev 包 —— 它以为你在复现之前的环境。
- ✅ 正确前提:lock 文件本身不含
require-dev包(比如由composer install --no-dev或 CI 环境首次生成) - ❌ 常见误操作:本地开发完 push 到服务器,直接在服务器跑
--no-dev,但 lock 文件是开发机生成的,含 dev 包 - ? 解决办法:上线前在 CI 或部署脚本中先运行
composer install --no-dev --prefer-dist,确保 lock 文件干净
composer install --no-dev 和 composer update --no-dev 的本质区别
前者是“按 lock 文件安装”,后者是“重算依赖并写入 lock”。如果你的目标是彻底剔除 dev 依赖,install 只能帮你跳过安装,而 update --no-dev 才能真正从 lock 文件里删掉它们 —— 但代价是可能触发版本变动,不适合线上直接执行。