初始化可发布composer包需满足:1. composer.json含合法name(vendor/name小写格式)、autoload(推荐psr-4);2. github仓库公开并打语义化git标签(如v1.0.0);3. 通过packagist webhook自动同步,确保权限与配置正确。

怎么初始化一个可发布的 Composer 包
核心是让 composer.json 符合 Packagist 的识别规范,不是随便写个 JSON 就能被收录。它必须有明确的 name(格式为 vendor/name,比如 myname/my-awesome-package),且不能和已有包重名;必须声明 autoload,否则别人 require 进去也加载不到你的类。
常见错误现象:composer install 报错 Class not found,或 Packagist 提交后显示 “Package not found in VCS”,大概率是 name 格式错、仓库地址没填对,或 autoload 没配好路径。
-
name必须小写、只含字母数字和短横线,vendor部分建议用 GitHub 用户名(保持一致,避免混淆) -
type推荐设为library(除非你做的是插件/模板等特殊类型) -
autoload优先用"psr-4",例如{"MyName\MyAwesomePackage\": "src/"},确保src/下有对应命名空间结构 - 加一个
readme.md,Packagist 会自动抓取——没这个文件,页面会显得很空,影响信任度
为什么 GitHub 仓库必须公开且带 Git 标签才能被 Packagist 收录
Packagist 不抓 ZIP 或直接读源码,它靠轮询 Git 仓库元数据来发现新版本。私有仓库无法访问,自然不会被索引;没打标签(git tag v1.0.0),Packagist 就不知道哪个提交算“正式发布”,只会显示 dev-main 这种开发分支,别人 require 时得写 "dev-main as 1.0.0",极不友好。
使用场景:你改完 bug,想发个 patch 版本,但忘了 git push --tags,结果用户 composer update 死活拉不到最新版。
- 标签名必须符合语义化版本(
v1.0.0、v2.1.3),前面带v是惯例,Packagist 能识别 - 打标签前先
git push主干代码,再git tag v1.0.0 && git push --tags,顺序反了会导致标签指向空提交 - 如果改了
composer.json的version字段——别这么做,Packagist 完全忽略它,只认 Git 标签
怎么把包提交到 Packagist 并自动同步更新
现在 Packagist 已强制要求通过 GitHub/GitLab 等平台的 webhook 自动同步,手动 submit 一次后,后续所有新标签都会自动抓取,前提是 webhook 配置成功且仓库公开。
容易踩的坑:点完 “Submit” 按钮后页面显示 “Package submitted”,但几小时后仍看不到版本列表,大概率是 GitHub webhook 没触发,或者仓库没勾选 “Include all repositories” 权限。
- 首次提交去 https://www.php.cn/link/20a1f94e0e45384e8e08872de5a5e545,粘贴 GitHub 仓库 URL(必须是
https://github.com/xxx/yyy格式) - 登录 Packagist 后,进
Account > Webhooks确认 GitHub 已授权,并检查对应仓库的 webhook 是否启用(状态为 “Active”) - 新打标签后,可去 Packagist 包页点右上角
Update手动触发一次,确认是否报错(如 “No composer.json found” 说明标签指向的提交里缺该文件)
为什么 require 自己的包时总提示 “could not find package”
不是 Packagist 没收录,就是本地环境没走对源。Composer 默认只查 Packagist.org,如果你的包还没审核通过、或名字拼错、或用了私有域名但没配 repositories,就会报这个错。
性能影响:临时用 path 类型仓库本地调试没问题,但上线前必须切回 Packagist 源,否则部署机没权限读你本地路径,CI 也会失败。
- 检查拼写:
composer require myname/my-awesome-package,注意 vendor 和 name 全小写、无下划线 - 刚提交包,等几分钟再试——Packagist 审核已取消,但索引可能有分钟级延迟
- 若在公司内网或测试阶段,需在项目根目录
composer.json加"repositories"块,用"type": "vcs"指向 GitHub 地址,而非"type": "package"手动定义(后者易出版本冲突)
最常被忽略的一点:Packagist 不校验代码质量,但会严格校验 composer.json 结构。哪怕多了一个逗号、少了一个引号,标签提交后都可能显示 “Invalid package information”,而错误提示藏在包页底部小字里,不点开 “Latest commit” 根本看不到。










