composer install --dry-run 比 update --dry-run 快得多,因其仅校验 composer.lock 的可安装性,跳过依赖重算、网络请求、下载解压及脚本执行;而 update --dry-run 需从头运行 SAT 求解器,遍历所有版本组合,耗时显著更高。

composer install --dry-run 为什么比 update 快得多
因为 install --dry-run 完全跳过网络请求、包下载、解压和文件写入,只做依赖图解析 + 锁文件校验 + 路径模拟。它不重新计算依赖树,也不触发任何脚本钩子,本质是“读 lock → 验证能否按它装”,所以通常在 1–3 秒内完成。
相比之下,update --dry-run 会先丢弃现有 composer.lock,从头运行 SAT 求解器,遍历所有可选版本组合,尤其当 minimum-stability 是 dev 或含大量 conflict 规则时,可能卡在 Resolving dependencies 十几秒甚至更久。
- 适合部署前守门:用
install --dry-run --no-dev --prefer-dist,5 秒内确认当前 lock 是否仍适用于目标环境 - 别在 CI 中用
update --dry-run做日常检查——它不是轻量验证,而是重型求解 - 若项目有自定义 repo 或私有包,
install --dry-run不联网查源,但会校验 lock 中记录的 dist URL 和 sha256 是否格式合法(不校验真实性)
哪些错误 --dry-run 根本不会报,但 install 一定会炸
install --dry-run 成功 ≠ 真能装上。它不碰磁盘、不调 PHP 扩展、不执行脚本,所以这些真实环节的失败它一律沉默:
-
file_put_contents(/vendor/autoload.php): Permission denied—— 权限问题只在写文件时暴露 -
The requested PHP extension dom is missing——--dry-run默认不校验require-dev包的平台约束,加--ignore-platform-reqs更会掩盖它 -
Failed to download vendor/package.zip: SSL certificate problem—— 网络和证书校验被跳过 -
post-install-cmd script failed—— 所有 scripts 字段定义的命令均被静默跳过
结论:--dry-run 是依赖冲突初筛工具,不是安装可行性验证工具。CI 中建议搭配 composer validate --strict --lock + composer show --locked + install --dry-run --no-dev 三步走。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么本地 --dry-run 成功,上线后 install 失败
最常见原因是环境差异未被 --dry-run 覆盖:
- PHP 版本或扩展不一致:比如本地开了
ext-dom,线上没开;或composer.json写了"php": ">=8.3",但线上只有 8.2 ——--dry-run不校验这个 -
composer.lock被手动改过或生成环境不同:validate --lock会发现 hash 不匹配,但--dry-run只按 lock 里写的装,不质疑它来源 - 用了
--ignore-platform-reqs跑--dry-run:它会让结果过度乐观,连php版本都不拦,上线后直接 ParseError - CI 使用了缓存的 vendor 或 lock 文件,而开发机上已
update过但没提交 lock ——--dry-run读的是旧 lock,自然“成功”
真正该盯住的不是 --dry-run 是否通过,而是它用的 composer.lock 是否由当前 composer.json + 当前环境生成。
一个够用的验证命令组合
单靠 composer install --dry-run 风险太高。生产级 CI 应至少跑这三行:
composer validate --strict --no-check-publish --lock composer install --dry-run --no-dev --prefer-dist --no-interaction composer show --locked | head -20
第一行确保 JSON 合法、字段合规、且 lock 与 json 一致;第二行模拟生产环境安装路径;第三行快速确认 lock 文件内容未被意外篡改(比如 commit 时漏掉 lock 更新)。注意:不要加 --ignore-platform-reqs,也不要省略 --no-dev —— 后者会让 --dry-run 解析一堆 dev-only 依赖,既慢又误导判断。

















