如何利用Composer创建并发布自己的开源类库

先说一个核心概念:Composer本身并不提供“发布”功能,它只是PHP的依赖管理工具。真正的发布流程,是将代码推送到Git仓库(比如GitHub),然后在Packagist上注册包名并同步元数据。如果没搞清楚这个先后关系,很容易卡在“本地测试一切正常,但别人就是composer require不到”的尴尬阶段。
确保类库结构符合PSR-4自动加载规范
Composer如何找到并加载你的类?完全依赖于composer.json里的autoload配置与实际的目录结构是否匹配。不按规范来,运行时抛出Class not found几乎是必然结果。
- 首先,项目根目录下必须存在
composer.json文件,并在其中的autoload段明确声明命名空间与路径的映射关系。例如:"autoload": { "psr-4": { "MyVendor\MyPackage\": "src/" } } - 其次,
src/目录下的文件结构必须与命名空间严格对应。比如,文件src/Http/Client.php对应的类名就应该是MyVendorMyPackageHttpClient。 - 配置完成后,记得运行
composer dump-autoload来生成自动加载文件。开发阶段可以不加参数,但在CI/CD流程或正式发布前,建议加上优化选项-o,即执行composer dump-autoload -o。
打标签(tag)是Packagist识别版本的关键
这里有个关键点:Packagist并不会去读取你的master或main分支,它只认Git tag。如果没有打tag,那么别人执行composer require myvendor/mypackage时,默认是拉取不到任何稳定版本的。
- 版本号必须遵循SemVer格式,比如
v1.0.0、v2.3.1。前面加v是社区惯例,Packagist虽然也支持不带v的格式,但统一使用v前缀会更稳妥。 - 打tag之前,最好确保
composer.json中的version字段与tag名称保持一致。这虽然不是强制要求,但能有效减少版本歧义。 - 具体的操作命令很简单:
git tag v1.0.0 git push origin v1.0.0
- 标签推送到远程仓库后,Packagist默认每15分钟会轮询一次更新。当然,你也可以在Packagist包页面上手动点击“Update”按钮来立即触发同步(前提是仓库已绑定)。
在Packagist上提交包并保持webhook活跃
第一次在Packagist提交包成功后,它会自动设置webhook来监听你仓库的push和tag事件。但需要注意的是,如果仓库长时间没有活动,这个webhook可能会被GitHub或GitLab自动禁用,导致后续推送的新tag无法同步到Packagist。
- 首先,访问Packagist官网并登录,点击右上角的“Submit”按钮,然后粘贴你的Git仓库HTTPS地址(例如
https://github.com/myvendor/mypackage)。 - 提交成功后,进入你的包管理页面,点击“Manage” -> “GitHub / GitLab / Bitbucket Integration”,按照指引安装Packagist应用并授权对应的仓库权限。
- 为了确保万无一失,建议去Git仓库的设置页面(如GitHub的Settings -> Webhooks)检查一下,确认指向
https://www.php.cn/link/ec811d0d775adc62776ba80fadd4ed19/github-webhook的webhook状态是“active”,并且最近的交付(delivery)状态是2xx成功。 - 如果发现旧的tag没有同步,可以尝试在Packagist页面手动点击“Force update”。但如果推送新tag后仍然失败,那大概率就是webhook连接断开了,需要重新检查或配置。
最后,还有一个最容易被忽略,却至关重要的细节:你的类库composer.json文件中,必须有一个明确的name字段,格式为vendor/package。并且,这个name在Packagist上必须是全局唯一的。如果发生重名,提交时会失败,而Packagist给出的错误提示往往比较模糊,通常只会显示“package not a vailable”,让排查变得困难。所以,命名时务必多花点心思,确保其唯一性。
