Packagist 不托管代码,需先将含合规 composer.json 的公开 GitHub 仓库提交,再通过 Packagist 提交 URL 并配置 Webhook 实现自动更新;name 必须小写且符合 vendor/name 格式,version 由 Git tag 决定,autoload 路径须与命名空间一致。

怎么把本地包推送到 Packagist(不是 GitHub)
Packagist 本身不托管代码,它只索引你已公开在 Git 平台(如 GitHub、GitLab)上的仓库。所以「发布到 Composer 官方库」实际分两步:先确保代码在 GitHub 上可公开访问并带 composer.json,再让 Packagist 抓取它。
- 你的 GitHub 仓库必须是 public,private 仓库无法被 Packagist 索引
-
composer.json必须放在仓库根目录,且包含至少name(格式为vendor/name,比如myname/my-awesome-package)、version或autoload字段 - 首次提交后,去 https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19 登录,点击右上角 “Submit” → 粘贴 GitHub 仓库 URL → 提交
- Packagist 会立即抓取一次,但后续更新依赖 Webhook:需在 GitHub 仓库 Settings → Webhooks 中添加 Packagist 的回调地址(提交时页面会提示,或手动填
https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/api/github)
composer.json 里哪些字段是必须的、哪些容易写错
缺关键字段会导致 Packagist 拒绝索引,或用户安装时报错 Could not find package xxx。最常出问题的是 name 和 type。
-
name必须符合vendor/name格式,且全部小写、只含字母数字和短横线;MyName/MyPackage或my_name/my-package都非法 -
type推荐显式设为library(默认值),但如果你做的是 WordPress 插件或 Laravel 包,应设为wordpress-plugin或laravel-package,否则自动加载可能失效 -
autoload若用 PSR-4,注意命名空间与路径映射要一致:"MyName\MyPackage\": "src/"要求src/下有MyPackage/子目录,否则composer install不报错,但类根本找不到 - 别在
version字段硬编码版本号——Packagist 以 Git tag 为准,composer.json里的version会被忽略
为什么打完 tag 还没更新?Webhook 失败的常见表现
很多人打完 git tag v1.0.0 并推送后,Packagist 页面仍显示旧版本,甚至几天都不变。这不是缓存问题,大概率是 Webhook 没触发成功。
- 检查 GitHub Webhook 设置:Payload URL 是否为
https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/api/github,Content type 是否选application/json,Trigger 选项是否勾选了 “Tag push events” - 点进 Webhook 的 “Recent Deliveries”,看状态是否为
200 OK;若显示401 Unauthorized,说明 Packagist 账户未关联 GitHub(去 Packagist Settings → Connected Accounts 补关联) - 若状态是
202 Accepted但没生效,可能是 Packagist 抓取失败:点开该 delivery 的 Response,看返回里有没有类似"error":"Could not clone ..."—— 常见于 GitHub 仓库权限变更或 token 过期 - 临时救急:在 Packagist 包页点 “Update” 按钮手动强制刷新(但不能替代 Webhook)
用户安装时提示 “package not found” 或 “could not resolve packages”
这通常不是你没发布成功,而是用户环境或配置出了偏差。
- 确认用户运行的是
composer require vendor/name,不是composer require vendor/name:dev-main—— 如果你还没打任何 tag,只有dev-main分支可用,但默认只找稳定版 - 用户可能开了
minimum-stability限制(如设为stable),而你只打了v1.0.0-beta这类非稳定 tag;要么打v1.0.0正式版,要么让用户加--stability=beta - 检查 Packagist 包页右上角是否显示 “Abandoned”,如果误点了 “abandon”,整个包会被隐藏,新用户完全搜不到
- 私有包?别忘了用户得在自己项目根目录的
composer.json里加repositories段指向你的 VCS 地址,Packagist 不处理私有源
真正卡住的地方往往不在“怎么发”,而在 Git 权限、Webhook 配置、tag 命名规范这三处。尤其 name 字段写错一次,就得换新名字重新提交——Packagist 不允许覆盖已注册的 vendor/name。










