直接比对两个composer.lock文件最准确,因其精确记录版本、哈希、url和依赖关系;composer show等命令输出不稳定、受环境干扰且不反映真实安装快照。

直接比对两个 composer.lock 文件是最准、最可控的版本对比方式;其他命令如 composer show 或 composer outdated 输出不稳定,无法跨环境复现,也不反映真实安装快照。
为什么不能用 composer show 做版本对比
它默认读取当前 vendor/ 目录 + composer.json 声明,不加 --locked 会混入 path repo、dev-only 包或未安装的 require-dev 依赖。终端宽度、ANSI 颜色、内部排序逻辑(字母序 vs 深度优先)都会导致两次输出结构不一致,diff 报满屏“变化”但实际没动任何包。
常见错误现象:
-
composer show monolog/monolog --tree在 CI 和本地输出顺序不同,diff显示大量差异 -
composer show不带--locked,查到的是已修改但未update的旧 lock 快照 -
composer show --all查的是 Packagist 远程列表,不是你项目里实际装的版本
怎么安全提取可比对的版本快照
核心是让两次输出结构完全一致:字段顺序固定、无颜色、无换行干扰、排除平台噪声。最稳的方式是导出 JSON 并用 jq -S 标准化键序。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 更新前执行:
composer show --locked --format=json | jq -S . > lock.before.json - 更新后执行:
composer show --locked --format=json | jq -S . > lock.after.json - 比对:
diff -u lock.before.json lock.after.json - 若只关心 name/version 变更,加过滤:
diff -u lock.before.json lock.after.json | grep -E '("name"|\"version\"|\"reference\"|\"shasum\")'
注意:jq -S 强制键名排序,确保相同内容在不同机器上生成完全一致的 JSON;不用它,composer show --format=json 输出的字段顺序可能因 Composer 版本而异。
用 composer-lock-diff 看人类可读变更
它跳过 JSON 解析,直接读取 composer.lock 结构,只比对 packages 和 packages-dev 中的 name、version、source.reference、dist.shasum,自动归类为「新增」「删除」「升级」「降级」四类,并标出是否影响 autoloader。
- 安装:
composer global require clue/composer-lock-diff - 备份旧 lock:
cp composer.lock composer.lock.bak - 更新后运行:
composer-lock-diff composer.lock.bak composer.lock - CI 场景可用
--format=github输出 Markdown 表格,方便 PR 评论区查看
它不解析 composer.json,也不检查约束是否合理——只告诉你 lock 文件里到底变了什么。如果你改了 composer.json 但没跑 composer update,它不会提示“该升没升”,只会说“没变”。
容易被忽略的关键点
platform 配置不一致会导致 composer.lock 大量“假变更”:比如一边是 "php": "8.2.0",另一边是 "php": "8.1.25",同一份 composer.json 生成的 packages 数量、版本、甚至是否包含某些包都可能不同。比对前必须确认两边 config.platform 完全一致,否则所有差异都不可信。










