composer 官方没有 post-package-update 钩子,正确做法是在 post-update-cmd 中通过解析 composer.lock 或调用 composer show --outdated 判断具体包是否更新后再执行操作。

post-package-update 钩子根本不存在
Composer 官方没有 post-package-update 这个事件钩子。这是常见误解,源于把 post-update-cmd 和包级生命周期混淆了——后者只在全局命令(如 composer update)结束时触发一次,不针对单个包。
想在某个包更新后执行操作?用 scripts + 逻辑判断
真正可行的方式是:在 post-update-cmd 中检查哪些包实际发生了变更,再针对性执行。关键靠 composer show --outdated 或解析 composer.lock 的 diff。
- 推荐做法:在
scripts里写一个自定义命令(比如handle-package-updates),绑定到post-update-cmd - 脚本中用
composer show vendor/package --outdated --format=json判断目标包是否升级(注意:该命令需 Composer 2.5+) - 更稳定的做法是对比
composer.lock更新前后的packages和packages-dev版本字段(需自己实现 diff) - 别依赖
post-install-cmd:它不区分“新装”还是“升级”,且无法得知哪个包变了
为什么不用 plugin 或事件监听?
理论上可通过 Composer Plugin 监听 PackageEvents::POST_PACKAGE_INSTALL 和 POST_PACKAGE_UPDATE,但这些事件属于内部 API,未公开、无文档、随时可能变动,且仅在插件上下文中可用,普通项目配置不可用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 官方明确不承诺这些事件的稳定性,
composer.json的scripts是唯一受支持的扩展点 - Plugin 开发门槛高,还要处理 Composer 版本兼容(1.x vs 2.x)、autoload 冲突等问题
- 即使监听到事件,也拿不到完整旧版本信息,仍需查 lock 文件补全逻辑
实际能跑通的最小示例
在 composer.json 的 scripts 中加一段:
"scripts": {
"post-update-cmd": [
"if composer show myvendor/mypackage --outdated --format=json 2>/dev/null | grep -q '\"version\":'; then echo 'mypackage updated — running post-step'; php ./scripts/after-mypackage-update.php; fi"
]
}
这个命令行逻辑简单粗暴但有效:composer show 在包已更新后返回非空 JSON 表示有变化;grep 检查是否存在 version 字段(避免误判未安装情况);./scripts/after-mypackage-update.php 是你自己的处理脚本。
注意:composer show 的输出格式不稳定,生产环境建议改用 PHP 脚本解析 JSON 并比对 lock 文件中的 version 字段——这才是真正可靠的方式。










