根本原因是Webhook未真正触发构建流程:Satis无内置服务,依赖脚本执行satis build;Private Packagist必须使用后台生成的唯一Webhook地址,不可手写或拼接,且Git平台需勾选Push和Tag事件、Content-Type设为application/json。

私有 Composer 镜像库无法自动更新新包或新版本,根本原因不是网络慢或命令没写对,而是 Webhook 没真正触发构建流程——Satis 不监听 Git 事件,它只认你写的脚本;而 Private Packagist 虽能自动同步,但必须用它自己的 Webhook 地址,不能自己拼 URL。
Webhook 触发的是脚本,不是 Satis 自身
Satis 是静态生成器,没有内置 HTTP 服务,也不接收或解析 Webhook。所谓“自动更新”,本质是 GitHub/GitLab 推送后调用你部署的 webhook.php(或其他端点),脚本里手动执行 satis build 命令。
- 脚本必须显式校验签名:GitHub 发
X-Hub-Signature-256,GitLab 发X-Gitlab-Token,Gitee 发X-Gitee-Token,不校验就等于裸奔开放执行权限 - 必须
chdir()切到satis.json所在目录再运行exec('php bin/satis build ...'),否则路径错、配置读不到 -
satis build输出目录(如/var/www/satis/)需被 Nginx 正确 serve,且 URL 必须以/结尾,否则 Composer 请求packages.json会 404 - 不要用
require-all: true:它会把所有分支和 dev-tag 全塞进packages.json,导致文件超大、加载超时、甚至 Composer 内存溢出
Private Packagist 的 Webhook 地址不能手写
Private Packagist 提供的是受控的同步通道,它的 Webhook URL 是后台生成的唯一地址(形如 https://packagist.com/webhook/abc123...),不是固定模板。填错、少字符、带斜杠结尾,都会返回 403 或静默失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 该 URL 只能在 Private Packagist 后台「Repositories → Add Repository」流程中复制,不可猜测或拼接
- Git 平台配置时,Content-Type 必须选
application/json,事件至少勾选Push events和Tag push events - Private Packagist 不验证 Git 请求头签名,但它会校验请求来源 IP 是否在白名单内(默认已配好),所以别关防火墙或加额外反向代理层
- 同步延迟通常
GitHub App 已取代旧版 Webhook,Packagist.org 不再接受手动配置
如果你还在 GitHub 仓库 Settings → Webhooks 页面里添加 https://packagist.org/api/github,那一定失败——这个接口自 2022 年起已下线,现在 Packagist.org 强制走官方 GitHub App。
- 必须访问
https://github.com/apps/packagist安装 App,并授权对应组织或仓库 -
composer.json中的name字段(如"myorg/my-utils")必须与 GitHub 路径(github.com/myorg/my-utils)完全一致,字母全小写、无下划线、无空格 - 只响应合法语义化 tag:
v1.0.0✅,1.0.0✅,release-v1❌,dev-main❌ - 首次同步失败不会弹窗提示,错误藏在 Packagist 包页面顶部红条里,比如
Invalid composer.json: missing name或Repository not found
最容易被忽略的一点:Satis 构建后生成的 packages.json 是静态文件,但 Composer 客户端默认会缓存它。如果更新了镜像却没生效,不是 Webhook 没跑,而是本地或 CI 的 Composer 缓存没清——执行 composer clear-cache 再试,比重跑构建更快。

















