不能。公有镜像(如阿里云)不暴露webhook接口,仅按需拉取,无法被主动触发同步;webhook仅对私有源(如satis、artifactory)和packagist官方有效,且payload url必须严格匹配对应服务的固定地址与事件类型。

Webhook 能不能直接触发公有镜像(如阿里云)同步?
不能。阿里云、腾讯云、中科大等国内公有 Composer 镜像站不对外暴露 Webhook 接口,也不接受任何主动推送请求。它们采用「按需拉取」策略:只有当客户端首次请求某个 provider-*.json 或 p2/vendor/package/1.0.0.json 文件时,镜像站才反向向 repo.packagist.org 拉取并缓存。你发 webhook 到这些镜像域名,会直接返回 404 或 405。
常见误操作:
- 把 GitHub Webhook Payload URL 改成
https://mirrors.aliyun.com/composer/api/update—— 这个路径根本不存在 - 在 CI 中执行
curl -X POST https://mirrors.tuna.tsinghua.edu.cn/composer/...—— 清一色被拒绝 - 以为配置了 Packagist 的 webhook 就等于国内镜像也立刻更新 —— 实际两者完全解耦,延迟几小时属正常
哪些场景下 Webhook 真正起作用?
Webhook 只在两类可控环境中生效:你自己的私有源(如 Satis、Artifactory、packagist-mirror),或 Packagist 官方侧(用于自动抓取你的 GitHub tag)。
关键区分点:
-
GitHub → Packagist:Payload URL 必须是https://packagist.org/api/github,且只响应push和tag push事件 -
GitHub → 你的私有 Satis:Payload URL 是你内网部署的 Satis 入口,例如https://satis.internal.example.com/webhook,需自行实现接收逻辑(或用现成的packagist-mirror) -
CI → 私有 Artifactory:用curl -X PUT向https://artifactory.example.com/artifactory/api/composer/...推送元数据,不是 webhook,但效果类似
注意:packagist.org 不支持自定义 webhook 地址,也不允许你改写它的回调行为;它只认固定地址和固定事件类型。
为什么打了 tag,Packagist 还没更新?
90% 是 GitHub Webhook 配置漏项或失败,不是延迟问题。Packagist 页面上 “Last updated” 时间不跳动,基本可判定 webhook 未成功送达。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
检查清单:
- GitHub 仓库 Settings → Webhooks → 新建或编辑 → Payload URL 填
https://packagist.org/api/github(不是带?username=的旧链接) - Content type 必须选
application/json - Events 部分必须勾选
Just the push event,再单独勾选下方的Tag push events - 保存后立即运行
git tag v1.0.1 && git push origin v1.0.1测试 - 回到 GitHub Webhooks → Recent Deliveries,找最新一条,状态码必须是
200;若为400或404,说明 URL 错或事件未匹配
补充:如果你用 GitHub Releases 发版,Event 类型选 Releases 更稳定,避免因 tag 未附带 release 描述而被忽略。
如何让私有镜像真正“实时”同步?
唯一可靠方式是放弃“被动等待”,改为主动构建 + 主动推送。Webhook 在这里只是触发器,不是同步主体。
典型链路:
- GitHub 触发 tag push → Webhook 投递到你内网 CI(如 Jenkins/GitLab CI)
- CI 执行
composer validate --strict校验composer.json,失败则中止 - CI 构建并上传 tarball 到私有对象存储(如 MinIO),生成可访问的
dist.url - CI 调用
php bin/satis build(Satis)或curl -X PUT ...(Artifactory)刷新元数据 - 最后可选:调用
curl -X POST https://your-mirror.internal/webhook/refresh强制清空本地 provider 缓存
重点:所有同步动作必须发生在你可控的服务节点上。别指望公有镜像替你做决策,也别把 Packagist 的 webhook 当作通用同步总线 —— 它只服务一个目标:把你 GitHub 上的 tag 变成 Packagist 页面上的版本列表。










