composer本身不生成变更日志,需借助git+jq提取composer.lock差异或使用composer-changelogs工具获取带release note的升级详情。

Composer 本身不生成变更日志(changelog),它只是 PHP 的依赖管理工具;你真正需要的是在 composer update 后,自动提取 composer.lock 差异并转化为人类可读的变更记录——这得靠外部工具或脚本配合。
为什么不能直接用 Composer 命令生成 changelog?
Composer 没有内置 changelog、diff-lock 或类似命令。它的 show --outdated 只能列出过期包,无法告诉你本次更新中哪些包从 v1.2.3 升到了 v1.2.4、哪些被新增/移除、是否含重大变更(BC break)。
-
composer outdated是快照式检查,不记录历史变化 -
composer update --dry-run不输出结构化差异,仅打印文本摘要 -
composer.lock是 JSON 格式,但手动比对两个版本的 lock 文件既易错又不可持续
推荐方案:用 git + jq 快速提取 lock 变更
前提是你的 composer.lock 已提交到 Git —— 这是最轻量、最可控的方式,无需引入新依赖或 CI 配置。
执行以下命令即可列出本次 commit 中所有包的版本变动:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
git diff HEAD~1 -- composer.lock | jq -r ' select(.packages?) | .packages[] | "\(.name) \(.version) → \(.version)' 2>/dev/null || true
更实用的写法(兼容新增/删除/修改):
git diff -U0 -- composer.lock | \
grep -E '^\+(\"name\"|\"version\"|\"source\"|\"dist\")' | \
sed 's/^[+-]//; s/[^a-zA-Z0-9._\-\/]+//g' | \
paste -d' ' - - - - | \
awk '{print $2, $4 " → " $8}' | \
sort -u
- 依赖
jq或基础 shell 工具,无需 PHP 环境 - 只对比 Git 中已保存的 lock 版本,避免本地未提交导致误判
- 注意:如果
composer.lock被格式化(如缩进变化),git diff可能产生大量噪音,建议统一用composer update --lock保持格式一致
想自动化集成进 CI 或提交钩子?用 composer-changelogs 工具
第三方工具 composer-changelogs(由 @jwage 维护)能基于 lock 文件差异 + Packagist API 获取每个包的 GitHub release note:
composer global require jwage/composer-changelogs composer-changelogs --from=HEAD~1 --to=HEAD
- 输出包含每个升级包的「新增特性」「修复项」「破坏性变更」链接
- 要求目标包在
composer.json中声明了source或dist的 GitHub URL,否则 fallback 到版本号对比 - CI 中使用时需确保
COMPOSER_HOME可写,且网络能访问 packagist.org 和 GitHub - 不适用于私有仓库包,除非你自行实现
ChangelogProviderInterface
真正难的不是生成那几行文字,而是判断某次 composer update 是否影响了你代码里实际调用的接口 —— lock 文件变了,不代表你的业务逻辑就安全。别跳过人工核对关键包的 MAJOR 版本跃迁。










