Packagist 不提供写入 API,所有包管理依赖 Git 仓库 webhook;composer install/update 仅单向拉取静态索引文件,不调用 API;查询元数据可用只读 /p2/ 接口,但不稳定;私有包须用 Satis 等私有仓库方案。

Packagist 不提供官方 API 供用户直接写入或管理包(如发布、删除、更新),composer 命令本身也不支持通过 API 调用完成包的提交或权限操作——所有包注册、更新触发、自动同步都依赖 GitHub/GitLab 等源码仓库的 webhook 推送。
为什么 composer install / update 不调用 Packagist API?
composer 在安装或更新时,只读取 packagist.org/packages.json(或镜像站点对应路径)这个静态索引文件,它本质是压缩后的 JSON 列表,不含认证、不需 token。整个流程是单向拉取,不涉及 POST 或身份校验。
- 执行
composer update时,Composer 会先请求https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/packages/list.json(或缓存副本)获取包名列表,再按需下载每个包的dist或source元数据(即composer.json) - 所有元数据最终来自包仓库的
composer.json文件,Packagist 只做抓取、验证、缓存和索引 - 没有
POST /api/v1/package这类接口;所谓“提交包”实际是向 Packagist 网站前端表单提交仓库 URL,后端再配置 webhook
如何让 Packagist 自动同步你的包?
唯一受支持的自动化方式是配置 Git 仓库的 webhook,不是调用 API。
- 确保你的 GitHub/GitLab 仓库根目录有合法的
composer.json - 登录 packagist.org,进入 Your Packages → Submit Package,填入仓库 URL(如
https://github.com/username/my-package) - Packagist 会返回一个专属 webhook URL(形如
https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/api/github?username=xxx),把它添加到 GitHub 的 Settings → Webhooks 中,Content type 选application/json,只勾选Pushes和Repository dispatch - 后续你推送新 tag(如
v1.2.0)或合并到默认分支,Packagist 就会自动抓取并索引
能否用脚本查询某个包的最新版本信息?
可以,Packagist 提供公开只读的包级元数据接口,但无认证、有频率限制、结构不稳定,仅适合简单查询。
例如获取 monolog/monolog 的完整元数据:
curl -s "https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/p2/monolog/monolog.json"
注意:
- 返回的是压缩后的 JSON(含 base64 编码的
packages字段),需解码解析;真实结构随 Packagist 版本变化,不建议用于生产级依赖解析 - 路径格式为
/p2/{vendor}/{package}.json,vendor 和 package 名需小写、短横线转下划线(如symfony/http-foundation→symfony/http_foundation.json) - 不要高频轮询,会触发 429;应优先使用本地
composer show或缓存packages.json
想批量管理多个包(如私有包)怎么办?
别碰 Packagist —— 它只面向开源 PHP 包。私有或内部包必须用私有仓库方案:
- 用
satis搭建静态包索引:它生成类似 Packagist 的packages.json,但由你完全控制源和权限 - 用
toran proxy(已停止维护)或现代替代品如Private Packagist、SatisPress - 在
composer.json中显式声明repositories,类型设为vcs或composer,指向你自己的服务地址
任何试图绕过 webhook、伪造请求向 packagist.org 提交包的行为,都会被拒绝;它的后台不接受外部 API 写入,这是设计使然,不是权限或 token 没配对的问题。










