composer update 从不读取 changelog.md,其版本升级仅依据 composer.json 约束和 composer.lock;要应用 changelog 中的变更,需手动执行 composer update 或修改 composer.json 版本后更新。

composer update 从不读 CHANGELOG.md
CHANGELOG.md 是给人看的,不是给 Composer 解析用的。无论你把它写得多规范、多详细,composer update 启动时根本不会打开这个文件,更不会根据它决定装哪个版本。
常见错误现象:composer update 装完后发现某个修复没生效,翻 CHANGELOG.md 看到“Fixed X in v2.3.1”,但 vendor 里却是 v2.3.0 —— 这说明你当前 composer.lock 锁的就是 2.3.0,而 CHANGELOG 里写的 v2.3.1 还没被拉进来。
- 判断是否已包含某次变更,唯一可靠依据是
composer.lock中对应包的version字段 -
composer outdated显示可升到 v2.3.1,只代表 Packagist 上有这个 tag,不代表它已进入你的 lock 文件 - 想确认 CHANGELOG 里写的改动是否生效,先查
cat composer.lock | jq -r '.packages[] | select(.name=="vendor/package") | .version'
如何让 CHANGELOG 变更真正落地到项目中
CHANGELOG 里的内容要变成实际代码,必须经过 Composer 的版本解析和安装流程。它不自动触发,也不提供“按日志升级”功能。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果目标版本在
composer.json的约束范围内(比如写的是"vendor/package": "^2.3"),运行composer update vendor/package就可能升到 v2.3.1 - 如果想精确锁定 CHANGELOG 里提到的版本,直接改
composer.json:"vendor/package": "2.3.1",再跑composer update vendor/package - 切勿删掉
composer.lock后只跑composer install—— 它会报错,因为没有 lock 文件时install无法还原
composer outdated --all 和 CHANGELOG 的关系最实用
composer outdated --all 是唯一能把本地已装版本和远程最新版(含 tag 名)对齐查看的命令,它比手动翻 CHANGELOG 更快定位“哪些变更我还没拿到”。
- 输出里带
[dev-main]或[v2.3.1]的行,对应的就是 CHANGELOG 中标题为## [2.3.1] - 2026-08-15的那一节 - 加
--direct可过滤出你composer.json里亲手写的依赖,避免被子依赖干扰判断 - 注意:如果某包显示
2.3.0 → 2.3.1但你没在 CHANGELOG 里找到对应条目,大概率是维护者漏写了,别假设“肯定有”
UpdateHelper 插件能桥接 CHANGELOG 和命令行操作
原生 Composer 不做日志联动,但插件 kylekatarnls/update-helper 可以在 composer update 执行后,主动读取已安装包的 CHANGELOG.md 并高亮本次更新涉及的变更项。
- 它通过
post-update-cmd钩子触发,只对已成功安装进vendor/的版本生效 - 需确保包仓库里
CHANGELOG.md存在且符合 Keep a Changelog 规范,否则解析失败 - 不推荐在 CI 流程中启用交互式提示,但可在本地开发时加
"scripts": {"post-update-cmd": "update-helper"}自动提醒
CHANGELOG 和 Composer 命令之间没有自动映射关系,所有“看到日志→执行升级”的动作都得人来判断版本号、校验约束、触发命令。最容易被忽略的是:你以为 outdated 显示的版本一定能装上,但实际可能被 platform 配置或 conflict 规则挡住 —— 这时候得看 composer update --dry-run 的真实求解结果,而不是 CHANGELOG 里写的“支持 PHP 8.2”。










