Packagist 自2023年底起停止自动抓取GitHub仓库,包必须由作者主动提交并验证;name需为小写vendor/name格式,须打符合semver的tag(如v1.0.0),且需配置GitHub webhook指向Packagist。

packagist.org 不再自动抓取 GitHub 仓库
Packagist 已于 2023 年底彻底关闭自动发现(auto-discovery)功能。现在 composer require 能装到的包,必须由作者**主动提交并验证**,否则 Packagist 根本看不到你的仓库。
常见错误现象:Package not found、Could not find package xxx at any version,哪怕 GitHub 仓库是公开的、composer.json 也写对了——根本没提交到 Packagist 就查不到。
- 必须手动访问
packagist.org→ 点右上角 “Submit” → 粘贴 GitHub/GitLab 仓库 URL - 首次提交会触发 webhook 自动绑定,后续 push tag 后 Packagist 才会自动拉取新版本
- 如果提交后显示 “This package is not auto-updated”,说明 webhook 没配好,要进 GitHub Settings → Webhooks 手动加一条指向
https://packagist.org/api/github的 POST 请求
composer.json 必须有 name 和 version(或稳定 tag)
Packagist 不接受无 name 或 name 格式错误的包。它要求 name 是 vendor/name 形式,且全部小写、只含字母数字和短横线(-),不能有下划线或大写字母。
使用场景:本地 composer install 可能不报错,但 Packagist 提交时直接拒绝。
-
"name": "myorg/my-awesome-package"✅ -
"name": "MyOrg/MyPackage"❌(含大写) -
"name": "my_org/my-package"❌(下划线) - 没有
version字段?没问题——但你得打 Git tag,比如v1.0.0,且 tag 名必须符合semver规范(v1.0.0、1.2.3都行,dev-main不算正式版)
require 和 autoload 配置稍有偏差就导致安装失败
用户 composer require 成功不代表能用。最常踩的坑是 autoload 没映射对路径,或者 require 写了开发专用依赖(如 phpunit/phpunit)却没移进 require-dev。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
性能影响:autoload 错误会导致类找不到(Class not found);require 错误则可能让使用者项目因依赖冲突直接装不上。
-
"autoload": { "psr-4": { "MyOrg\MyPackage\": "src/" } }—— 注意末尾斜杠和命名空间结尾反斜杠 - 确保
src/目录真实存在,且文件命名与类名严格一致(Foo.php里必须是class Foo) - 运行
composer dump-autoload --no-dev本地验证 autoload 是否生效 - 别在
require里写"php": "^8.1"这种——那是config.platform.php或 CI 里该管的事
私有包或测试阶段别硬推 main 分支到 Packagist
Packagist 默认把 main / master 分支当作 dev-main 版本发布。如果你还在频繁改接口,别人 composer require myorg/my-package:dev-main 就会随时断掉。
兼容性影响:没有稳定 tag 的包,Composer 默认不启用(minimum-stability 默认是 stable),用户得显式加 @dev 才能装,体验差还容易误用。
- 发布前至少打一个
v0.1.0或v1.0.0tag,并确保composer.json里"version"字段与 tag 一致(或干脆删掉 version 字段,靠 tag 驱动) - 日常开发用
dev-feature/x这种分支名,别碰main;Packagist 不会自动同步非默认分支,除非你手动配置 - 想临时试用?用
pathrepo 方式本地加载更安全:{ "repositories": [{ "type": "path", "url": "../my-package" }], "require": { "myorg/my-package": "*" } }
事情说清了就结束。最常卡住的地方不是写代码,而是提交前没检查 name 格式、没打合法 tag、也没配 webhook——这三步缺一不可。










