跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Composer如何发布到Packagist官网_开源PHP扩展包发布流程【实战】

Packagist 仅索引公开 Git 仓库中的 composer.json,需满足:仓库公开、含合法 composer.json(含 name、type、autoload)、name 格式为 vendor/package 且 vendor 与 Packagist 账号一致、文件位于 main/master 分支根目录,并在 Packagist 提交 URL;提交失败主因是 name 不匹配、仓库私有、命名不一致或未设 webhook;自动更新依赖语义化 tag(如 v1.0.0)推送,version 字段应留空;autoload 配置错误、缺失 require、PHP 版本约束过严、缺 license 字段亦会导致安装或使用异常。 Packagist 不接受手动上传,必须通过 GitHub/GitLab 等公开仓库自动同步 —— 这是绝大多数人卡住的第一步。 你的 GitHub 仓库是否满足 Packagist 的自动发现前提? Packagist 本身不托管代码,只索引公开 Git 仓库中的
composer.json
。要被成功抓取,必须同时满足: 仓库为 公开(public) ,且包含合法的
composer.json
(至少有
name
、
type
、
autoload
)
name
字段格式为
vendor/package
,且
vendor
必须与你的 Packagist 账号用户名完全一致(大小写敏感) GitHub 仓库的
main
(或
master
)分支根目录下存在该文件 你已在 Packagist 登录并点击右上角 “Submit” 输入仓库 URL(如
https://github.com/yourname/your-package
) 为什么提交后显示 “Package not found” 或 “Invalid package name”? 这是最常触发的失败提示,原因集中在命名与权限上:
composer.json
中的
name
值(如
"myorg/my-pkg"
)和你在 Packagist 注册的用户名(
myorg
)不一致 → 修改
name
或改用对应账号提交 GitHub 仓库设为私有 → Packagist 无法读取,必须设为 public 仓库名含下划线(
my_pkg
)但
name
写成短横线(
my-pkg
)→ Packagist 严格校验,二者必须完全一致 未在 GitHub 设置 Packagist webhook(虽非必需,但推荐启用:进入仓库 Settings → Webhooks → Add webhook,Payload URL 填
https://packagist.org/api/github
) 如何让 Packagist 自动更新新版本(tag)? Packagist 默认只扫描
main
分支的最新 commit,但真正发布稳定版靠的是 Git tag。你需要: PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; 本地打符合语义化版本规范的 tag:
git tag -a v1.0.0 -m "Release v1.0.0"
推送到 GitHub:
git push origin v1.0.0
(注意不是
git push --tags
,后者可能推送过多历史 tag) 确保
composer.json
中的
version
字段 不要填写 —— Packagist 会从 tag 名自动提取版本号;填了反而可能导致冲突或忽略 tag 等待 Packagist 自动轮询(通常 1–5 分钟),或手动进入包页面点击 “Update” 按钮强制刷新 常见但容易被忽略的细节 很多包能上线却无法被正常 require,问题往往藏在配置深处:
autoload
没配对:用
"psr-4"
就必须保证命名空间前缀与目录结构匹配,否则
composer install
后类找不到 缺少
require
声明:即使依赖的是 PHP 核心扩展(如
ext-json
),也应显式写进
composer.json
的
require
或
require-dev
,否则用户安装时无提示 PHP 版本约束太激进:
"php": "^8.2"
会直接拦住所有 8.1 用户,而实际代码可能完全兼容 → 用
"php": ">=7.4"
更稳妥 未设置
license
字段:Packagist 不强制,但没有许可证的包会被 Composer 警告,且多数公司政策禁止引入无明确 license 的依赖

相关文章