跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

composer如何仅安装生产环境依赖?(--no-dev参数使用场景)

默认情况下 composer install 会安装 require 和 require-dev 全部依赖,因 Composer 无环境识别能力;必须加 --no-dev 的场景包括线上部署、Docker production 构建及 CI/CD 部署阶段。 composer install 为什么装了 dev 依赖? 默认情况下
composer install
会安装
require
和
require-dev
里的全部包,哪怕你只是上线部署——这不仅拖慢速度,还可能引入测试工具、调试器等不该出现在生产环境的代码。 根本原因是 Composer 没有“自动识别环境”的能力,它只看
composer.json
和本地
composer.lock
,不会读取
APP_ENV
或服务器角色。 --no-dev 是什么,什么时候必须加?
--no-dev
是
composer install
和
composer update
的开关,作用是跳过
require-dev
区块里的所有依赖,只装
require
列表。 以下场景不加就容易出问题: Composer 2.9.6 Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。 下载 线上服务器部署时,用
composer install --no-dev
(不是
update
) Docker 构建阶段,在
production
镜像里避免打包
phpunit
、
phpstan
等 CI/CD 流水线中区分构建(需要 dev)和部署(不需要 dev)两个阶段 常见错误:--no-dev 没生效?检查这几点 加了参数却还是装了
phpunit
或
symfony/debug-bundle
?大概率是这些原因: 执行的是
composer update
而非
install
——
update
默认忽略
--no-dev
对 lock 文件的影响,且可能因依赖树间接拉入 dev 包
composer.lock
里原本就记录了 dev 包(比如之前在本地跑过 full install),而
install
严格按 lock 执行;此时需先删 lock 或确认 lock 是否由
--no-dev
生成 某些包把“开发时必需”写进了
require
(比如把
laravel/pint
放错位置),
--no-dev
压根不管它 用了
COMPOSER_NO_DEV=1
环境变量但没导出(bash 中需
export COMPOSER_NO_DEV=1
) 生产环境推荐的最小安全命令组合 别只记
--no-dev
,配套动作缺一不可: 部署前确保
composer.lock
是用
--no-dev
生成的(或至少不含 dev 包):本地运行
composer install --no-dev --optimize-autoloader
线上执行:
composer install --no-dev --optimize-autoloader --no-interaction
如果项目用 autoloader classmap,加
--classmap-authoritative
可进一步提速,但要求所有类路径必须可静态分析(多数 Laravel/Symfony 项目没问题) 禁用脚本执行:
--no-scripts
(防止
post-install-cmd
里调用 dev 工具) 真正麻烦的不是参数本身,而是 lock 文件是否干净、是否被多人共用、是否混入了本地开发时的临时修改——这些比记命令更容易翻车。

相关文章