composer install --dry-run 仅执行依赖解析与版本锁定校验,不下载、不解压、不写入 vendor 目录,也不触发脚本钩子;它基于现有 composer.lock 模拟安装,适用于上线前快速验证,但不校验 php 版本或扩展要求。

composer install --dry-run 会做什么
它不下载、不解压、不写入 vendor 目录,只做依赖解析 + 版本锁定校验 + 安装路径模拟。本质是让 Composer 走完 resolve → download → install 流程的前两步,但跳过所有文件系统操作。
常见错误现象:composer install --dry-run 报 Your requirements could not be resolved,但去掉 --dry-run 却能成功——说明本地 composer.lock 已过时或存在缓存干扰。
- 必须确保当前目录有有效的
composer.json和(通常也需)composer.lock,否则会退化为仅检查语法 - 如果
composer.lock缺失,--dry-run仍会尝试生成临时锁文件,但结果不可复现,慎用于 CI 环境 - 不触发
post-install-cmd或任何脚本钩子,哪怕配置了也静默跳过
和 composer update --dry-run 的关键区别
composer install --dry-run 基于现有 composer.lock 模拟安装;composer update --dry-run 则先重新解析依赖树,再模拟更新 —— 后者更重,也更容易暴露版本冲突。
使用场景:上线前确认 composer install 是否安全?用 install --dry-run;想评估升级某包是否引发连锁变更?必须用 update --dry-run。
-
install --dry-run快,适合部署流水线中快速守门 -
update --dry-run可能卡在Resolving dependencies,尤其当minimum-stability设为dev时 - 两者都不读取已安装包的
vendor/autoload.php,所以不会触发 autoloader 相关报错
容易被忽略的兼容性陷阱
--dry-run 不校验 PHP 版本与扩展是否满足 require-dev 中的 dev-only 包,比如 phpunit/phpunit 要求 ext-dom,但 --dry-run 默认不检查。
错误现象:本地 --dry-run 成功,上线后 composer install 失败并报 The requested PHP extension dom is missing。
- 加
--ignore-platform-reqs会让--dry-run更“乐观”,掩盖真实环境限制 - CI 中应始终搭配
--no-dev(如仅部署生产环境),否则--dry-run会包含 dev 依赖的解析逻辑,误导判断 - PHP 8.2+ 下某些包的
composer.json若含php >=8.3,--dry-run会直接失败,哪怕你没打算真装它
一个够用的验证命令组合
别只跑一次 composer install --dry-run,复杂项目需要分层确认:
- 基础可用性:
composer install --dry-run --no-dev --prefer-dist - 开发依赖影响:
composer update --dry-run --with-all-dependencies(注意:这会尝试升级所有依赖,非增量) - 锁定文件一致性:
composer validate && composer lock --dry-run(后者是 Composer 2.5+ 新增,校验 lock 文件结构)
真正危险的不是 --dry-run 报错,而是它沉默通过,但你的部署目标机缺少某个 platform config(比如 openssl 扩展未启用),这种环境差异只能靠预检脚本补全。










