要让 packagist 自动发现 composer 包,需先在 packagist 提交公开 github 仓库 url,并确保 composer.json 含合法 name(vendor/name、全小写)、type(如 library)和 psr-4 autoload;再配置 github webhook 指向 https://packagist.org/api/github,绑定账号并仅推送默认分支及符合 semver 的带 v 前缀 tag(如 v1.0.0)。

怎么让 Packagist 自动发现你的 Composer 包
Packagist 不主动爬取 GitHub,必须手动触发或配置自动同步。最可靠的方式是把 GitHub 仓库设为公开,并在 Packagist 上用 submit 表单提交仓库 URL(如 https://github.com/yourname/your-package)。提交后它会立刻拉取 composer.json 并索引——但前提是该文件存在且合法。
常见错误现象:Package not found 或提交后显示 Invalid package information,大概率是 composer.json 缺少必需字段,比如 name、type、autoload;或者 name 格式不对(必须是 vendor/name,且 vendor 名和你 Packagist 账号不一致就会被拒)。
-
name必须全小写,用连字符分隔,不能含下划线或大写字母 -
type建议填library(非框架、非应用),否则某些工具链可能跳过安装 -
autoload至少得有psr-4映射,空着或写错路径会导致依赖安装后无法require - GitHub 仓库必须公开;私有库即使登录了 Packagist 也无法提交
为什么 GitHub push 后 Packagist 没更新
Packagist 默认不会监听你的 Git 推送。要实现“一推就更新”,必须在 GitHub 仓库里配 Webhook,指向 Packagist 的回调地址 https://packagist.org/api/github。这个动作只能由仓库管理员操作,且需确认 Packagist 账号已绑定 GitHub。
容易踩的坑:Webhook 配了但没生效,常见原因是:
- GitHub 设置里没勾选
Just the push event,或没勾选Active - Packagist 账号未在
Settings → Connected accounts中完成 GitHub 绑定(仅登录不够) - 推送的分支不是默认分支(如设了
main但推送到了dev),Packagist 只监听默认分支 - 提交没带新 tag(Packagist 对无 tag 的 push 只更新 latest dev 版本,不生成稳定版)
打 tag 时要注意哪些命名和结构
Composer 安装稳定版靠的是 Git tag,不是分支名。tag 名必须符合版本约束语法,否则 Packagist 识别不了,用户也装不到 v1.2.3 这样的版本。
正确做法是用语义化版本(SemVer)打 tag,命令是:git tag -a v1.0.0 -m "Release v1.0.0",然后 git push origin v1.0.0。
- 必须以
v开头(v1.0.0✅,1.0.0❌),否则 Packagist 当作 dev 分支处理 - 不要用
-alpha、-beta等后缀(v1.0.0-beta会被识别为不稳定版,需显式加@beta才能装) - 同一 commit 不要打多个 tag(如
v1.0和v1.0.0),Packagist 会混乱,优先取最长匹配 - tag 提交前确保
composer.json里的version字段已删掉(它会被 Packagist 忽略,留着反而易误改)
本地开发时怎么测试 packagist 流程是否走通
别等 push 到 GitHub 再验证。用 composer validate 先检查 composer.json 是否合法;再用 composer install 看 autoload 是否真能加载类;最后模拟 Packagist 行为:在另一项目中临时 require 本地路径,确认能正常 require 类。
实操建议:
- 运行
composer validate --strict,它比默认校验更严,能提前暴露字段缺失或格式错误 - 在包根目录执行
composer dump-autoload -o,再进vendor/autoload.php所在项目,用php -r "require 'vendor/autoload.php'; var_dump(class_exists('Your\Class'));"直接测加载 - 临时测试安装:在测试项目中加
"repositories": [{"type": "path", "url": "../your-package"}],再composer require yourname/your-package:dev-main,绕过 Packagist 直接走本地文件系统
最常被忽略的是 autoload 的命名空间路径映射是否与实际目录结构一致——写错一个斜杠,class_exists 就返回 false,但报错信息里完全不提 autoload,排查起来特别绕。










