最直接有效的方式是加 --no-dev 参数;它让 composer install 只安装 require 中的包,跳过 require-dev 里的所有依赖,且不修改 composer.lock 中的 dev 记录。

composer install 时怎么跳过 dev 依赖
关掉开发模式,本质就是不让 Composer 安装 require-dev 里声明的包。最直接有效的方式是加 --no-dev 参数。
常见错误是只改 composer.json 里的 "minimum-stability" 或删掉 require-dev 字段——这不解决问题,反而可能破坏本地开发环境或 CI 配置。
-
composer install --no-dev:只装require中的包,跳过所有require-dev -
composer update --no-dev:更新时也忽略 dev 包(慎用,会锁死composer.lock中的 dev 包版本) - CI/CD 环境中建议固定使用
composer install --no-dev --prefer-dist --optimize-autoloader,减少体积、提升加载速度
为什么 COMPOSER_DEV_MODE=0 不起作用
这个环境变量根本不存在于 Composer 官方文档和源码中,是社区误传。Composer 没有“开发模式开关”这种全局配置项,它只看当前命令是否带 --no-dev,以及 composer.json 结构。
你可能在某些私有脚本或 Dockerfile 里见过它,那只是某个人自定义的逻辑判断,不是 Composer 本身的行为。
- 检查是否误用了自定义 wrapper 脚本(比如项目根目录下有
bin/composer) - 运行
composer --version确认你调用的是原生 Composer,不是别名或封装命令 - 用
which composer和composer diagnose排查环境干扰
composer install 和 composer update 在 dev 依赖上的关键区别
两者的触发时机和影响范围完全不同:install 是按 composer.lock 还原依赖,update 是重新解析并写入 lock 文件。加不加 --no-dev 对它们的影响方式也不同。
-
composer install --no-dev:只跳过安装 dev 包,但 lock 文件里仍保留 dev 依赖记录(不影响下次不带--no-dev的安装) -
composer update --no-dev:不仅不装 dev 包,还会从composer.lock中彻底移除所有 dev 依赖条目,后续再install就再也装不上了 - 生产部署应始终用
install --no-dev,而不是update --no-dev,避免意外修改 lock 文件
自动检测环境并默认禁用 dev 依赖可行吗
可以,但得靠外部控制,Composer 本身不提供条件判断语法。最稳妥的做法是在部署脚本里做环境判断,而不是试图魔改 composer.json。
比如在 shell 脚本中:
if [ "$ENV" = "production" ]; then
composer install --no-dev --optimize-autoloader
else
composer install
fi
注意:不要在 composer.json 中用 scripts 自动加 --no-dev,因为 scripts 执行时无法感知当前命令参数,容易造成本地开发时误删 dev 工具。
真正容易被忽略的是 lock 文件的残留影响——哪怕你一直用 --no-dev,只要 lock 文件里有 dev 包,别人在没加参数的情况下执行 install 就还是会装上。所以生产环境部署前,务必确认 lock 文件是否干净,或者干脆用 --ignore-platform-reqs + --no-dev 双保险。









