composer如何发布自己的PHP包到Packagist_composer包发布详细流程【教程】

5次阅读

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

composer如何发布自己的PHP包到Packagist_composer包发布详细流程【教程】

你的包还没托管到 GitHub/GitLab,先别急着提交到 Packagist

Packagist 不托管代码,只索引公开 Git 仓库(主流是 GitHub、GitLab、Bitbucket)。它通过 webhook 自动拉取更新,所以第一步必须把代码放在支持的远程仓库里,并确保 composer.json 文件已提交。

常见错误:本地 git init 后直接点 “Submit” —— Packagist 会报 Repository not foundCould not fetch package info

  • 仓库必须是公开的(private 仓库无法被 Packagist 抓取)
  • composer.json 必须在仓库根目录,且包含必需字段:name(格式为 vendor/name,如 myname/my-awesome-package)、descriptiontype(如 library)、autoload
  • 建议提前跑一遍 composer validate,避免语法错误导致索引失败

如何正确触发 Packagist 的自动更新(不是手动 Submit)

旧教程常提“点击 Submit”,那是早期流程。现在官方推荐用 webhook 自动同步,否则每次发版都要手动点击,极易漏更或延迟。

关键操作在 GitHub 侧:

立即学习PHP免费学习笔记(深入)”;

  • 进入你的 GitHub 仓库 → Settings → Webhooks → Add webhook
  • Payload URLhttps://packagist.org/api/github
  • Which Events would you like to trigger this webhook?Just the push event(或勾选 Releases 如果你用 tag 发版)
  • 保存后,下次 git pushgit push --tags 就会自动触发 Packagist 更新

验证是否生效:推送一个新 commit 后,打开 Packagist 页面,看右上角「Last updated」时间是否变化;或者查看 webhook 的 Recent Deliveries 状态码是否为 200

版本号怎么写才被 Packagist 正确识别?

Packagist 依赖 Git tag 解析版本,不读 composer.json 里的 version 字段(该字段应删除或留空)。

Tag 名称必须符合 Composer 版本规范,否则会被忽略:

  • ✅ 正确:v1.0.01.2.3v2.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.jsonnameautoload 都合法。

为什么别人 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 constraintMissing autoload section

text=ZqhQzanResources