要发布可被 composer 安装的 php 包,需组织符合 psr-4 的目录结构、编写含 name/type/autoload/license 的 composer.json、推送到 github 并在 packagist 提交后打 v 开头的语义化标签。

Composer 本身不“创建”包,它只是管理依赖的工具;真正要发布一个可被 composer require 安装的 PHP 包,你需要手动组织代码结构、写好 composer.json、打 Git 标签,并推送到支持 Packagist 的代码托管平台(如 GitHub)。跳过任意一步,别人就 require 不了你的包。
如何组织一个可发布的 PHP 包目录结构
Composer 对包的物理结构没有强制要求,但 Packagist 和主流项目都默认遵循 PSR-4 自动加载规范。最简可行结构如下:
my-awesome-package/ ├── src/ │ └── MyAwesomePackage/ │ └── Calculator.php ├── tests/ ├── composer.json └── README.md
关键点:
-
src/是源码根目录,对应 PSR-4 的命名空间起点 -
composer.json中必须声明"autoload": {"psr-4": {"MyAwesomePackage\": "src/MyAwesomePackage/"}}—— 注意末尾斜杠和命名空间结尾的双反斜杠 - 不要把
vendor/或composer.lock提交到包仓库里 - 如果包有命令行工具,入口文件(如
bin/mytool)需在composer.json中用"bin"字段声明
composer.json 必填字段与常见陷阱
Packagist 要求至少包含 name、type、autoload 和 license。漏掉 name(格式必须是 vendor/name,比如 me/calculator)会导致无法提交到 Packagist。
典型 composer.json 示例:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"name": "me/calculator",
"type": "library",
"description": "A simple calculator for demo",
"license": "MIT",
"autoload": {
"psr-4": {
"Me\Calculator\": "src/"
}
},
"require": {
"php": "^8.1"
}
}
注意:
-
name中的 vendor 名必须和你在 Packagist 注册的用户名一致,否则提交失败 -
"type": "library"是默认值,但显式写出更稳妥;如果是 WordPress 插件,应写"wordpress-plugin" -
require里不要写开发依赖(如phpunit),它们应放在require-dev中 - 若包只供本地项目使用,无需发布,可直接用
path仓库类型本地加载,不用碰 Packagist
如何让别人能 composer require 你的包
核心动作只有三步:推送到公开 Git 仓库 → 在 Packagist 提交包 → 打语义化版本标签。缺一不可。
操作顺序:
- 将代码推送到 GitHub(或其他支持的平台),确保
master或main分支存在且含有效composer.json - 登录 Packagist,点击右上角 “Submit” → 粘贴你的仓库 URL(如
https://github.com/me/calculator)→ 提交 - Packagist 会自动抓取最新 commit,但此时还不能
require—— 你必须打一个符合 SemVer 的 tag,例如:git tag -a v1.0.0 -m "first release",然后git push --tags - 稍等 1–2 分钟,刷新 Packagist 页面,看到版本号出现,才算真正可用
常见失败原因:
- 提交后 Packagist 显示 “Could not fetch”,大概率是仓库私有或 URL 拼错
- 打 tag 后仍不显示版本?检查 tag 名是否以
v开头(v1.0.0✅,1.0.0❌) - Packagist 抓取的是 tag 对应的 commit,不是 branch;改了
main分支内容不会自动更新已发布的版本
最易被忽略的一点:包名(name)和 Git 仓库地址共同构成唯一标识,一旦发布,改名成本极高——Packagist 不允许重名,也几乎无法迁移。起名前多想两秒,比后期重定向、废弃、发新包省心得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










