Composer怎么发布自己的包_Composer提交到Packagist流程【发布】

5次阅读

packagist 认出 github 仓库需满足:根目录有 composer.json,且 name 字段为小写短横线格式(如 myorg/laravel-helper);打语义化版本 tag(如 v1.0.0)才能被安装;autoload 必须正确配置 psr-4 或 files 并运行 composer dump-autoload。

Composer怎么发布自己的包_Composer提交到Packagist流程【发布】

怎么让 Packagist 认出你的 github 仓库

Packagist 不会自动扫描 GitHub,它只认你手动提交的仓库地址,而且必须满足两个硬条件:composer.json 存在、且 name 字段格式合法(形如 vendor/name,不能带下划线或大写字母)。

常见错误现象:Package not found 或提交后显示 “this package is not auto-updated”,本质是 Packagist 根本没解析成功。

  • 确保 composer.json 在仓库根目录,不是子文件夹里
  • name 必须全小写、用短横线分隔,比如 myorg/laravel-helper 合法,MyOrg/LaravelHelpermyorg_laravel_helper 都会被拒
  • 如果之前提交失败过,改完 composer.json 后得去 Packagist 页面点 “Update” 手动触发重抓,不会自动轮询

为什么 composer install 装不到你刚发布的包

刚提交到 Packagist 并不等于立刻能装——Packagist 默认只索引 stable 版本,而新仓库首次发布时,所有 tag 都默认被识别为 dev-main(或 dev-master),不属于稳定版本。

使用场景:你在本地 composer require myorg/mypackage 报错 Could not find package myorg/mypackage,其实它已在 Packagist 列表里,只是没标 stable。

  • 必须打一个符合语义化版本规范的 tag,比如 v1.0.0v0.5.2,不能是 1.0release-1
  • tag 推送到 GitHub 后,等 Packagist 自动抓取(通常几分钟),或手动点 “Update”
  • 临时调试可用 composer require myorg/mypackage:dev-main,但生产环境别这么干

如何避免 autoload 失效导致类找不到

发布后 composer require 成功,但一调用就 class not found,八成是 autoload 配置没对上——Composer 不会自动猜你源码在哪。

参数差异:用 "psr-4" 还是 "files"?取决于你的结构。PSR-4 要求命名空间与目录严格对应;files 适合单文件函数库,每次加载都 include

  • 如果代码在 src/ 目录下,且命名空间是 MyOrgMypackageautoload 得写:"psr-4": {"MyOrgMypackage": "src/"}
  • windows 下路径斜杠方向不影响,但反斜杠在 JSON 里要双写:"MyOrgMypackage"
  • 改完 composer.json 后,本地测试前必须运行 composer dump-autoload,否则缓存还是旧的

私有包或非 GitHub 仓库怎么处理

Packagist 只支持公开的 GitHub、gitlab、Bitbucket 仓库,且必须能被公网访问。如果你用 gitee、自建 Git 服务,或想限制安装权限,Packagist 就不适用了。

性能 / 兼容性影响:绕过 Packagist 意味着用户得手动加 repositories 配置,还可能遇到 https 证书、ssh key、Token 权限等问题。

  • 最简方案:在项目 composer.jsonrepositories 里加一条 type vcs 的记录,指向你的 Git 地址
  • 企业级方案:搭私有 Packagist(如 private Packagist)或 Satis,但维护成本明显上升
  • 别把敏感配置(如 API key)写进 composer.json,它会被所有人看到——用 config.json 或环境变量替代

最容易被忽略的是版本号和 autoload 命名空间的一致性:tag 是 v1.0.0,但 src/ 下的文件命名空间写成 MyOrgV1Helper,Composer 就找不到类——它不看 tag,只认 composer.json 里写的映射关系。

text=ZqhQzanResources