执行 composer update 后需通过比对 composer.lock 快照获取变更:更新前备份为 composer.lock.prev,更新后用 diff 或 git diff 比较,或用 jq 提取包名与版本差异生成增删改报告。

composer update 后怎么知道哪些包变了?
Composer 本身不生成变更日志,composer update 执行完只输出安装/更新的包名和版本,但不记录「从什么版本升到什么版本」,也没法回溯上一次状态。想导出依赖项变更日志,必须借助外部比对机制。
核心思路是:在每次 composer update 前后分别保存 composer.lock 的快照,再用工具比对差异。
- 最轻量做法:手动备份
composer.lock为composer.lock.prev,更新后再用diff或git diff查看变化 - 推荐自动化:用
composer outdated --direct --minor-only配合脚本预检,再结合 Git 提交前后的 lock 文件 diff - 注意:仅靠
composer show --outdated不行——它只显示当前可升级项,不反映本次实际更新了哪些
用 git diff 解析 lock 文件变更最可靠
只要项目已纳入 Git,composer.lock 又是被跟踪文件,就能直接利用 Git 历史提取精确变更。这是目前最稳定、无需额外依赖的方式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer update后,先git add composer.lock,再git commit -m "chore: update deps" - 生成报告时运行:
git diff HEAD~1:composer.lock HEAD:composer.lock | grep -E '^\+.*name|^\+.*version|^\-.*name|^\-.*version'—— 这能粗筛出增删改的包名与版本 - 更清晰的格式化建议:
git diff --no-index --unified=0 /dev/null | sort) /dev/null | sort) | grep -E '^\+|^-'(需安装jq) - 注意:如果
composer.lock被忽略或未提交,Git 方法失效;另外packages-dev区块变动也要单独处理,否则漏掉开发依赖
有没有现成命令一键生成更新报告?
没有官方命令,但社区有轻量脚本可复用。不建议装重型插件(如 composer-changelogs),它们往往依赖 GitHub API、需要 token,且对私有包支持差。
- 推荐用这个 Bash 片段(存为
bin/composer-diff-report):
#!/bin/bash if [[ ! -f composer.lock.prev ]]; then echo "Missing composer.lock.prev. Run 'cp composer.lock composer.lock.prev' before update." exit 1 fi jq -r '.packages[] | "\(.name)@\(.version)"' composer.lock.prev | sort > /tmp/prev.txt jq -r '.packages[] | "\(.name)@\(.version)"' composer.lock | sort > /tmp/current.txt echo "=== Updated ===" diff /tmp/prev.txt /tmp/current.txt | grep '^>' | sed 's/^> //' echo "=== Removed ===" diff /tmp/prev.txt /tmp/current.txt | grep '^
- 使用前确保已安装
jq(apt install jq或brew install jq) - 每次更新前必须手动运行
cp composer.lock composer.lock.prev,否则脚本报错退出 - 该脚本不处理
packages-dev和platform变更,如需完整覆盖,得额外加两行jq提取逻辑
为什么不能只依赖 composer show 或 composer status?
composer show 显示当前安装状态,composer status 只检查源码是否被修改——二者都完全不涉及版本变更历史。它们无法回答「这次 update 升了几个包?哪个从 2.1.0 到 2.2.0?」这类问题。
-
composer show vendor/package返回的是当前版本详情,不是变更记录 -
composer status -v输出类似...has modified files,仅针对vendor/下文件内容,跟 lock 文件语义无关 - 真正关键的变更信息全藏在
composer.lock的 JSON 结构里:尤其是packages数组的增删、version字段变化、以及source/reference的哈希值更动 - 最容易被忽略的一点:lock 文件里同一包可能出现在
packages和packages-dev两个数组中(比如某包既被 require 又被 require-dev 引用),比对脚本若只扫前者,就会漏掉开发环境实际变动










