composer怎么打包自己的插件_composer发布Packagist流程【详解】

composer不提供打包功能,发布的是符合psr-4规范的git仓库;关键步骤为:写好composer.json(含合法name、autoload等)、推送到公开仓库、打v开头语义化tag(如v1.0.0)、提交url至packagist并启用自动更新。

composer怎么打包自己的插件_composer发布Packagist流程【详解】

Composer 本身不提供“打包”功能,它只是依赖管理器;你要发布的不是 zip 包,而是符合 PSR-4 自动加载规范的 Git 仓库,并通过 Packagist 做元数据索引。关键动作是:写好 composer.json、推到公开 Git 仓库、再提交给 Packagist。

确保项目结构和 composer.json 符合 Packagist 要求

Packagist 不拉取代码,只抓取你 Git 仓库根目录下的 composer.json,并据此索引包名、版本、自动加载规则等。常见失败原因就是这个文件缺失或字段不合法。

  • "name" 必须是 vendor/package 格式(如 "myorg/my-plugin"),且全小写、仅含字母数字、连字符和下划线
  • "type" 建议设为 "library"(非应用),Packagist 会据此分类,但非强制
  • "autoload" 必须正确映射命名空间到目录,例如:
    "autoload": {   "psr-4": {     "MyOrgMyPlugin": "src/"   } }
  • 不要在 composer.json 中写 "require": { "php": "..." } 以外的运行时依赖——除非你真要限制 PHP 版本;开发依赖(如 phpunit)应放在 "require-dev"

用 Git 管理版本,打带语义化标签的 release

Packagist 通过 Git 标签识别版本。它不读 composer.json 里的 "version" 字段(该字段会被忽略),只认 tag 名,比如 v1.0.0v2.1.3。没有 tag 就没有稳定版。

  • 确保 Git 仓库公开可访问(GitHub / GitLab / Gitee 等均可,但需允许 Packagist 抓取)
  • 每次发布前,先提交全部变更,再执行:
    git tag v1.0.0
  • 推送 tag 到远程:
    git push origin v1.0.0

    (注意不是 git push --tags,避免误推未审核的临时 tag)

  • Tag 名必须以 v 开头(如 v1.0.0),否则 Packagist 可能无法识别为稳定版本

提交到 Packagist 并启用自动更新

首次提交需手动操作,后续靠 webhook 自动同步。Packagist 不托管代码,只存元数据指针。

  • 登录 packagist.org,点击右上角 “Submit”
  • 填入你的 Git 仓库 URL(如 https://github.com/myorg/my-plugin),Packagist 会自动抓取最新 composer.json 并校验格式
  • 提交成功后,在包页面点击 “Edit”,勾选 “Enable auto-updates”,然后按提示在 GitHub/GitLab 后台添加 Packagist Webhook(事件选 PushesTag creation
  • 之后每次 git push origin v1.0.1,Packagist 会在几分钟内自动拉取新 tag 并索引

本地测试安装是否正常

别等用户报错才验证。发布前务必用真实 Composer 命令模拟安装流程,重点检查自动加载和依赖解析。

  • 新建空目录,运行:
    composer require myorg/my-plugin:dev-main

    (用 dev-main 测试默认分支)

  • 若报 Could not find package myorg/my-plugin,说明 Packagist 还没索引,或名字拼错;用 composer clear-cache 清缓存再试
  • 安装成功后,进 vendor/myorg/my-plugin/ 检查文件结构是否完整,src/ 下类能否被 MyOrgMyPluginSomeClass::class 正确引用
  • 如果类找不到,90% 是 autoload 配置路径与实际目录不一致,或命名空间声明(namespace)和 composer.json 中定义不匹配

最容易被跳过的环节是:没打 tag 就去 Packagist 提交,或者打了 tag 却忘了 git push origin <tag></tag>。Packagist 页面显示 “No releases” 就是这个原因。另外,composer.json 里写错 vendor 名,会导致整个包无法被 require——因为名字一旦注册,就不能改,只能删包重来。