composer如何发布自己的包到Packagist?(从composer.json到上线全流程)

1次阅读

packagist 不托管代码,仅索引公开 github 仓库;需先创建含有效 composer.json 的公开仓库,再用 github 登录 packagist 并配置 api Token 和 webhook,确保 name、description、autoload 等字段合规,最后通过 path repository 本地验证。

composer如何发布自己的包到Packagist?(从composer.json到上线全流程)

packagist.org 账号和 GitHub 仓库先得配好

Packagist 不托管代码,只索引公开 Git 仓库(主流是 GitHub)。你得先有 GitHub 账号,并把包代码推到一个公开仓库里——私有仓库不会被 Packagist 抓取。

接着去 packagist.org 注册账号,用 GitHub 登录就行。登录后点右上角头像 → “Profile” → “API Token”,记下那个 token,后面要用。

  • GitHub 仓库名建议用 vendor/name 格式,比如 myname/laravel-helper,和 composer.json 里的 "name" 字段严格一致
  • 仓库必须含有效的 composer.json,且不能是空仓库(至少有一个 commit)
  • 如果 GitHub 仓库是组织名(如 acme/thing),composer.json 中的 "name" 也必须写成 "acme/thing",大小写、连字符、下划线都得一模一样

composer.json 必须包含哪些字段才能过 Packagist 校验

Packagist 会解析 composer.json 并校验基础字段。缺 "name""description" 会直接拒绝提交;"type" 虽非强制,但推荐填(如 "library""laravel-package"),影响 Packagist 页面分类。

  • "name":格式为 "vendor/name",vendor 名必须和你在 Packagist 的用户名或组织名一致(不能是别人已注册的 vendor)
  • "description":不能为空字符串,至少写 5 个英文单词(中文描述会被接受,但不推荐)
  • "autoload":至少得有 "psr-4""psr-0",否则包装不上,require 后类找不到
  • "license":建议填标准 SPDX ID,如 "MIT""apache-2.0";填 "proprietary" 也能过,但 Packagist 会标黄警告

示例最小可用片段:

{     "name": "myname/json-validator",     "description": "A lightweight JSON schema validator for PHP",     "type": "library",     "license": "MIT",     "autoload": {         "psr-4": { "MyNameJsonValidator": "src/" }     } }

提交后没更新?可能是 webhook 没配或 token 权限不对

手动提交一次后,Packagist 就会监听你 GitHub 仓库的 push 事件,自动抓取新 tag。但首次提交失败最常见原因是 webhook 没触发,或 GitHub token 权限不足。

  • 在 Packagist 页面点击 “Submit” 后,它会跳转到 GitHub 授权页——务必勾选 public_repo 权限(不是 repo,后者是私有库权限,没必要还多风险)
  • 提交成功后,去 GitHub 仓库 Settings → Webhooks,确认有个目标 URL 是 https://packagist.org/api/github 的 hook,且最近一次 delivery 状态是 200 OK
  • 如果改了 composer.json 但 Packagist 页面没刷新,别急着重提,先去 Packagist 包页点右上角 “Update” 按钮手动触发同步
  • 打 tag 前记得 git push --tags,Packagist 只认 annotated tag(git tag -a v1.0.0 -m "release"),lightweight tag 不识别

本地开发时怎么测试包是否真能被 require 进来

别等发完才试,本地就能验证 autoload 和版本约束是否生效。关键是绕过 Packagist,用 Composer 的 path repository 类型直连本地目录。

  • 在测试项目根目录的 composer.json 里加一段:
"repositories": [     {         "type": "path",         "url": "../myname/json-validator"     } ], "require": {     "myname/json-validator": "*" }
  • 然后 composer update myname/json-validator,Composer 会软链接本地目录,而不是从 Packagist 下载
  • 这样能立刻验证命名空间、文件路径、autoload 配置是否写错——很多“发布成功但 require 报 class not found”问题,都是本地没测就发上去的
  • 注意:这个 path 方式仅限开发,上线前要删掉 repositories 段,否则别人装你的包会失败

真正容易被忽略的是 vendor 名冲突和 PSR-4 命名空间路径拼写——大小写敏感、末尾斜杠有没有、src 目录是否存在,错一个字符就 class not found,而且错误提示里根本不会告诉你哪行 composer.json 写错了。

text=ZqhQzanResources