Composer无内置包更新通知机制,需依赖packagist.org API轮询比对composer.lock中版本或commit hash实现近实时通知,但须规避速率限制、重复告警及dev包刷屏等问题。

Composer 本身不提供发布订阅式的包更新通知机制,所有“自动通知”都得靠外部工具或自定义脚本补足,没有现成的 composer notify 命令,也不存在官方支持的钩子事件如 post-package-update。
为什么 Composer 的钩子无法监听第三方包更新
Composer 的事件(如 post-update-cmd、post-install-cmd)只在本地执行 composer update 或 install 时触发,且不区分哪些包被更新——它不知道 monolog/monolog 是新增、降级还是小版本 bump。更关键的是,这些钩子只对当前项目生效,无法跨项目统一监听或广播。
-
scripts配置里的钩子只响应本项目的命令,不感知 packagist.org 上的发布动作 - 没有类似
on-package-release这样的事件,也没有 Webhook 注册入口 - 即使监听
post-update-cmd,你也拿不到“本次更新了哪些包、从 v2.3.0 → v2.4.0”这样的细粒度变更数据
用 packagist.org API + 定时轮询实现近实时通知
packagist.org 提供公开 API,可查包的最新版本和发布时间,这是目前最可行的轻量方案。核心逻辑是:定期请求 https://repo.packagist.org/p/{vendor}/{package}.json,比对本地 composer.lock 中记录的 commit reference 或 version 字段,发现差异即触发通知。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不要直接解析
composer.lock的packages数组——它不含远程发布时间,需结合packages-dev和lock.version交叉判断 - 推荐用
composer show --locked --format=json输出结构化数据,再提取name、version、source.reference - 轮询间隔建议 ≥15 分钟,避免触发 packagist 的速率限制(返回
429 Too Many Requests) - 通知渠道选 Slack / 邮件 / Telegram 均可,但务必带上
diff -u式变更摘要,例如:laravel/framework: 10.28.0 → 10.29.0 (2024-04-12)
如何避免重复告警和误报
单纯比对版本号会出问题:语义化版本(如 ^2.0)允许 minor 更新,但你未必需要为每个 patch 版本发通知;而 dev-master 类型依赖又可能每次 commit 都变,导致刷屏。
- 对稳定版本(
1.x、2.3.0),只在major或minor变更时通知,忽略patch(如2.3.0 → 2.3.1) - 对
dev-开头的版本,只比对source.reference的前 7 位 commit hash,且加 24 小时冷却期 - 维护一个本地 SQLite 数据库存储“上次已通知的版本”,而不是依赖内存或临时文件
- 跳过
require-dev中的工具类包(如phpunit/phpunit),除非明确配置了notify-dev: true
真正难的不是轮询或发消息,而是准确判断“这次变更是否值得通知”。版本字符串解析、commit hash 稳定性、锁文件格式变化、私有仓库兼容性——这些细节没处理好,通知系统要么静默失效,要么每天半夜推送 37 条无意义更新。

















