造可信赖的PHP包需正确配置composer.json四字段:name须为小写vendor/name格式;type推荐library;autoload必配psr-4映射;version由Git tag决定,须打v前缀tag并推送。

你不是在写一个项目,而是在造一个别人能装、能更新、能信赖的包——这和写业务代码完全是两回事。
composer.json 必须填对的 4 个字段
很多人本地测试能跑通,一 push 到 GitHub 就 Package not found,问题往往出在 composer.json 最基础的元数据上。
-
"name"必须是vendor/name格式(如"myorg/my-awesome-package"),且全小写、只含字母数字和短横线;GitHub 仓库名不等于包名,但必须一致才能被 Packagist 自动识别 -
"type"推荐填"library"(默认值),别留空或乱填"project"——否则 Packagist 不会收录 -
"autoload"至少得有"psr-4"映射,比如{"MyOrg\MyAwesome\": "src/"};漏掉这个,composer install后类根本不会被自动加载 -
"version"不要手动写死(如"1.0.0");它由 Git tag 决定,composer require myorg/my-awesome-package默认拉最新 tag,不是master分支
发布前必须打 Git tag,不是 push 分支
Packagist 不监听分支推送,只抓取 Git tag。你 git push origin main 再多次,它也看不到新版本。
- 打 tag 要用语义化版本:运行
git tag v1.0.0,不是git tag 1.0.0(缺v前缀会导致 Packagist 解析失败) - tag 必须推送到远程:
git push origin v1.0.0;只本地打 tag 没用 - 如果改了
composer.json又想重发同版本,先删远程 tag:git push origin :v1.0.0,再删本地git tag -d v1.0.0,最后重新打+推
Packagist 手动 submit 后还要点 “Update”
首次提交后,Packagist 页面会显示 “This package is not auto-updated”,意思是它不会自动监听你的新 tag——除非你主动配置 webhook 或手动触发更新。
- 进 Packagist 页面,找到你的包,点右上角
Update按钮(不是Submit)才能拉取最新 tag - 后续想自动更新?去 GitHub 仓库 Settings → Webhooks → Add webhook,Payload URL 填 Packagist 提供的 hook 地址(格式类似
https://packagist.org/api/github?username=myorg),Content type 选application/json,只勾选Releases事件 - Webhook 配好后,每次
git push origin --tags,Packagist 就会自动同步新版本——但第一次仍需手动点一次Update
require-dev 里的包绝不能进生产 autoload
本地开发时加一堆测试工具到 require-dev 很自然,但若在 autoload 里错误地包含了 tests/ 目录,就会导致线上环境加载不存在的类,报 Class not found。
- 只把真正需要被用户
use的代码放进autoload["psr-4"],比如"src/";tests/、examples/、bin/全部排除 - 验证方式:临时删掉
vendor/,运行composer install --no-dev,再php -r "var_dump(class_exists('MyOrg\MyAwesome\SomeClass'));",应返回true - 如果返回
false,说明 autoload 路径没对上,或者命名空间与目录结构不匹配(比如src/Helper.php里写了namespace MyOrgMyAwesome;,但 autoload 映射的是"MyOrg\MyAwesome\": "src/",那就得改成"MyOrg\MyAwesome\Helper\": "src/Helper/"或调整文件位置)
最常被忽略的其实是版本号和 tag 的耦合关系:你改了代码、改了 composer.json 的 version 字段,但没打新 tag,Packagist 就永远卡在旧版本;反过来,打了 tag 却忘了 push,或者 push 错了远程名,整个流程就断在第一步。包不是“写完就能用”,而是“tag 打对了、推上去了、Packagist 看到了”,三者缺一不可。










