直接比对 composer.lock 文件最可靠,Git diff 是最快审查手段但需过滤噪声;终端输出遗漏间接依赖变更、降级、哈希变化等关键信息;应聚焦 name/version/source/dist 字段,用 composer-lock-diff 获取语义化摘要,注意字段顺序、平台差异及重复包名隐含的降级信号。

直接比对 composer.lock 文件本身最可靠,Git diff 是最快、最轻量的审查手段——但裸 diff 容易被哈希、缩进、字段顺序等噪声淹没,必须配合过滤或结构化工具才能看清真实变更。
为什么不能只看 composer update 终端输出
终端输出只显示顶层包的版本跳变(如 "Updating guzzlehttp/guzzle (7.8.0 => 7.8.1)"),但它不记录:间接依赖是否被连带升级(比如 psr/log 从 2.0.0 升到 3.0.0)、某个包是否因平台约束被降级、dist.shasum 是否变化(可能指向已下线 ZIP)、甚至 source.reference 是否指向了不同 commit。这些都可能引发 BC break 或 CI 失败,而终端一闪就过,无法回溯。
用 git diff 快速抓关键字段
别扫全文件,聚焦真正影响行为的字段。以下命令能快速定位增删改:
-
git diff HEAD~1 composer.lock | grep -E '^\+.*"name"|^\+.*"version"|^\-.*"name"|^\-.*"version"'—— 只看新增/删除的包名和版本变动 -
git diff --no-color HEAD~1 composer.lock | grep -E '^ {4}"(name|version|source|dist)'—— 四格缩进行里找 name/version/source/reference/dist.shasum,避开 time、generatedAt 等无关字段 - 若发现
"version": "dev-main"或"reference": "abc123"出现在 diff 中,必须确认是否真需绑定不稳定分支或特定 commit
用 composer-lock-diff 获取语义化摘要
这是目前最接近“人话”的比对方式,它跳过 JSON 结构噪音,直接标出增删改、升降级、是否仅影响 dev 依赖:
- 全局安装:
composer global require clue/composer-lock-diff,确保~/.composer/vendor/bin在$PATH中 - 更新前备份:
cp composer.lock composer.lock.bak - 更新后运行:
composer-lock-diff composer.lock.bak composer.lock - CI 场景可用:
git show HEAD~1:composer.lock | composer-lock-diff - composer.lock,无需 PHP 环境
它不解析 composer.json,也不关心 vendor/ 是否存在,纯静态分析 lock 文件——这意味着即使 lock 文件损坏或 vendor 被清空,只要 JSON 合法,它就能工作。
容易被忽略的陷阱
composer.lock 的 diff 不是纯文本对比游戏。字段顺序随 Composer 版本变化(1.x 按写入顺序,2.x 默认字母序)、dist.shasum 在不同系统上末尾补零逻辑不同、platform 配置不一致会导致整块 packages 数组偏移。更隐蔽的是:同一包名在 diff 中出现两次(如 symfony/event-dispatcher 同时有 6.3.2 和 7.0.0),说明 Composer 已做降级处理,必须回溯 composer.json 中哪些 require 引入了冲突约束——这种信号,裸 diff 看不见,composer-lock-diff 也未必标出,得靠人工核对 packages 区块结构。


















