根本原因是packagist未收到github/gitlab的webhook通知或触发条件不匹配;需正确配置webhook地址、勾选tag push事件、确保仓库url一致、删除composer.json中的version字段,并显式推送tag。

为什么 push tag 后 Packagist 没有自动更新?
根本原因通常是 Packagist 没收到你的 GitHub/GitLab 仓库的 webhook 通知,或者 webhook 配置了但触发条件不匹配。Packagist 不轮询仓库,只靠你主动“推”事件过去。
- GitHub 侧必须在
Settings → Webhooks中添加 Packagist 的 endpoint(https://packagist.org/api/github),且Which events would you like to trigger this webhook?要勾选 Just the push event 或至少包含Tag push events - GitLab 侧需在
Settings → Webhooks填https://packagist.org/api/gitlab,并勾选Tag push events - 旧版 Packagist(v1)要求 webhook payload 中
repository.url和 Packagist 上包的 source URL 完全一致(含git@或https://前缀),不一致会导致静默失败 - 用
curl -X POST https://packagist.org/api/update-package?username=xxx&apiToken=yyy手动触发时,如果返回404,大概率是包名或 token 权限不对,不是网络问题
composer.json 的 version 字段要不要写?
不要写。写死 "version": "1.2.3" 是常见误操作,它会覆盖 Git tag 解析结果,导致 Packagist 抓到错误版本号,甚至拒绝更新。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 发布前确保
composer.json中version字段被完全删除,或注释掉 - Packagist 依赖 Git tag 自动推断版本:tag
v2.1.0→ 版本2.1.0;tag2.1.0(无v)→ 版本2.1.0;但release/2.1这类非语义化 tag 默认被忽略 - 如果你用
composer require vendor/name:dev-main测试开发版,那main分支的composer.json就不能有version,否则会报could not determine package version
GitHub Actions 自动打 tag 并触发 Packagist 更新怎么做?
关键不是“自动打 tag”,而是打完 tag 后确保 GitHub Action 能把 tag 推到远端——默认 git push 不推 tag,必须显式加 --tags 或 --follow-tags。
- CI 脚本中打 tag 后,必须执行
git push origin --tags(注意不是git push) - GitHub Actions 的
on: push: tags触发器只响应手动 push tag,不响应 workflow 内部的 git 命令,所以别指望靠它二次触发 - 若想在 CI 中验证 Packagist 是否收到更新,可加一步:
curl -s "https://repo.packagist.org/p/vendor/name.json" | grep -q '"time":"[^"]*",检查最新版本时间戳是否刷新 - 避免在 CI 中用
composer update修改composer.lock后再 commit —— 这类自动提交容易引发循环触发或版本混乱
私有包怎么让 Packagist 同步?
Packagist 官方不支持私有仓库同步。所谓“同步”,其实是你用自己的服务器或 CI 工具模拟 Packagist 的抓取逻辑,或改用私有 Packagist 实例(如 Private Packagist、Satis)。
- 开源包走官方 Packagist,私有包要么托管在 GitLab/GitHub 私有库 + Composer
repositories配置为vcs类型,要么部署 Satis(轻量)或 Private Packagist(商业) - 如果硬要让官方 Packagist “看到”私有库,唯一办法是把仓库设为公开——但这违背私有初衷,且一旦设为公开,所有历史 commit 都暴露
-
repositories中写"type": "vcs"时,Composer 会直接 clone 仓库并读取composer.json,不经过 Packagist,因此也不存在“自动更新”一说;版本仍靠 Git tag,但需手动composer update或清理 cache 才能感知新 tag
/api/,或者 tag 名带空格,都会卡住,而且没有明确报错提示。调试时优先查 GitHub/GitLab 的 webhook delivery logs,比翻 Packagist 日志快得多。










