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