Packagist 不托管代码,只索引公开 GitHub/GitLab 等仓库;需先将含合法 composer.json 的代码推送到公开远程仓库,配置 GitHub webhook 自动同步,并用规范 tag(如 v1.0.0)发布版本。

你的包还没托管到 GitHub/GitLab,先别急着提交到 Packagist
Packagist 不托管代码,只索引公开 Git 仓库(主流是 GitHub、GitLab、Bitbucket)。它通过 webhook 自动拉取更新,所以第一步必须把代码放在支持的远程仓库里,并确保 composer.json 文件已提交。
常见错误:本地 git init 后直接点 “Submit” —— Packagist 会报 Repository not found 或 Could not fetch package info。
- 仓库必须是公开的(Private 仓库无法被 Packagist 抓取)
-
composer.json必须在仓库根目录,且包含必需字段:name(格式为vendor/name,如myname/my-awesome-package)、description、type(如library)、autoload - 建议提前跑一遍
composer validate,避免语法错误导致索引失败
如何正确触发 Packagist 的自动更新(不是手动 Submit)
旧教程常提“点击 Submit”,那是早期流程。现在官方推荐用 webhook 自动同步,否则每次发版都要手动点击,极易漏更或延迟。
关键操作在 GitHub 侧:
立即学习“PHP免费学习笔记(深入)”;
- 进入你的 GitHub 仓库 → Settings → Webhooks → Add webhook
-
Payload URL填https://packagist.org/api/github -
Which events would you like to trigger this webhook?选Just the push event(或勾选Releases如果你用 tag 发版) - 保存后,下次
git push或git push --tags就会自动触发 Packagist 更新
验证是否生效:推送一个新 commit 后,打开 Packagist 页面,看右上角「Last updated」时间是否变化;或者查看 webhook 的 Recent Deliveries 状态码是否为 200。
版本号怎么写才被 Packagist 正确识别?
Packagist 依赖 Git tag 解析版本,不读 composer.json 里的 version 字段(该字段应删除或留空)。
Tag 名称必须符合 Composer 版本规范,否则会被忽略:
- ✅ 正确:
v1.0.0、1.2.3、v2.1.0-beta.1 - ❌ 错误:
1.0(缺少补零)、release-1.0.0(带前缀)、1.0.0-final(带后缀) - 发布命令示例:
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
注意:Packagist 默认只索引带 v 前缀的 tag(如 v1.0.0),但也能识别无前缀的语义化版本(如 1.0.0)——前提是你的 composer.json 中 name 和 autoload 都合法。
为什么别人 composer require 不到你的包?
最常被忽略的三个点:
-
name字段拼错:比如写成myname/my-awesome--package(多了一个短横),会导致composer require myname/my-awesome--package找不到 -
autoload配置无效:例如"psr-4": {"MyName\\": "src/"}但实际类文件没放在src/下,或命名空间不匹配,Composer 装完也无法加载 - 未设置 Packagist 的 GitHub 绑定:首次提交后需登录 Packagist,进 Your Profile → Account Settings → Connect GitHub Account,否则 webhook 请求会被拒绝(返回
401 Unauthorized)
调试建议:在 Packagist 包页点击右上角 Update 按钮强制重抓,然后看下方「Error log」是否有具体提示,比如 Could not parse version constraint 或 Missing autoload section。











