是的,composer update --dry-run 真的不会改代码:它完整执行依赖解析(读取 composer.json/lock、连远程源、解冲突),但跳过下载、写 vendor、更新 composer.lock 和执行脚本;仅输出变更摘要,不涉及文件级修改。

composer update --dry-run 真的不会改代码吗?
composer update --dry-run 不会写入 composer.lock,也不会安装/删除/替换任何包文件,它只模拟更新流程并输出将要发生的变更。但要注意:它仍会读取当前 composer.json、已安装包的版本、以及远程仓库元数据(如 packagist.org),所以网络通畅和本地 vendor 未被破坏是前提。
常见误判场景:--dry-run 报错(比如 Your requirements could not be resolved)说明新版本根本不可达或冲突,这时候强行上线 update 就会失败——它不是“假装执行”,而是真做依赖求解,只是跳过了写磁盘步骤。
怎么用 --dry-run 验证特定包升级是否安全?
直接限定包名,缩小模拟范围,既快又聚焦。例如想测 monolog/monolog 升到 ^3.0 的影响:
composer update monolog/monolog --dry-run --with-dependencies
--with-dependencies 很关键:它会让 Composer 一并模拟其传递依赖的变动(比如 psr/log 是否也要升),否则容易漏掉隐式冲突。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不加该参数时,
--dry-run只显示目标包本身版本变化,对下游影响无感知 - 如果项目里有
conflict规则或replace声明,它们仍会被检查并可能触发报错 - 注意
require-dev中的包默认不参与模拟,如需包含,得加--with-all-dependencies
为什么 --dry-run 输出里看不到文件级变更?
composer update --dry-run 的输出本质是「依赖图变更摘要」,不是 diff 工具。它告诉你 foo/bar 会从 1.2.3 升到 2.0.0,但不会列出 vendor/foo/bar/src/Helper.php 新增了哪个方法、或哪个类被标记为 @deprecated。
真正要预判运行时风险,得配合其他手段:
- 查目标包的 CHANGELOG 或 GitHub Releases 页面,重点关注
Breaking changes板块 - 用
composer show -t monolog/monolog看当前依赖树,再对比新版本文档里的依赖要求 - 如果包提供 PHPStan/PHP-CS-Fixer 配置,可在本地跑一次静态分析(此时 vendor 还是旧的,但能提前发现调用签名变化)
CI 流程里怎么可靠地用 --dry-run 做准入检查?
在 GitHub Actions 或 GitLab CI 中,不能只靠 --dry-run 成功就放行 PR。它通过只代表“依赖可解”,不代表“代码能跑”。必须组合验证:
- 先运行
composer update xxx --dry-run --with-all-dependencies,失败则直接退出 - 成功后,再用
composer prohibits xxx:new-version检查是否有其他已装包显式禁止该版本(比如某包"conflict": {"xxx": "^2.0"}) - 最后,把新版本下载下来(用
composer require xxx:new-version --no-update+composer update --lock)跑单元测试——这才是真正的关口
很多人卡在第三步:以为 --dry-run 通过就等于兼容,结果测试里一堆 Class not found 或 ArgumentCountError。依赖解析正确 ≠ API 兼容。










