能直接发布到Packagist并被稳定引用的Composer包,核心在于composer.json精准表达身份与加载规则:name必须为小写vendor/name格式,autoload需用PSR-4且namespace以反斜杠结尾、path以正斜杠结尾,require须严格按运行时依赖划分,且必须打v前缀语义化Git tag(如v1.0.0)并推送至公开仓库。

能直接发布到 Packagist 并被他人稳定引用的 Composer 包,核心不在于代码多漂亮,而在于 composer.json 是否精准表达了「这个包是谁、在哪、怎么用、依赖什么」——写错一个斜杠或少一个反斜杠,Class not found 就会静默发生。
composer.json 必须由 composer init 生成,别手写
90% 的包发布失败或本地加载异常,根源是 JSON 格式错误:全角引号、BOM 头、末尾逗号、路径拼写错误。这些错误 composer install 不报具体位置,只抛 JSON decode error。
- 执行
composer init,按提示填name(格式必须是vendor/name)、type(库选library)、autoload(推荐 PSR-4) - 它会自动探测
src/目录并建议命名空间,比你手动写"App": "src/"更可靠 - 生成后立刻运行
composer validate,它能秒级发现字段缺失、版本约束语法错误、命名空间未结尾等硬伤
PSR-4 自动加载配置的三个死线
Composer 不在运行时读 composer.json,而是在 dump-autoload 时把规则编译进 vendor/autoload.php。配错不会警告,只会让类永远找不到。
-
namespace必须以反斜杠结尾:"MyPackage\": "src/"✅,"MyPackage": "src/"❌ -
path必须以正斜杠结尾,且相对composer.json所在目录:"src/"✅,"./src"❌,"src"❌ - 改完
autoload后必须手动执行composer dump-autoload(加-o生成优化版,生产环境用)
require 和 require-dev 的边界必须用代码验证
不是“本地开发用”和“线上不用”的区别,而是“PHP 执行业务逻辑时是否 new/use 它”。分错会导致 CI 报错、线上挂掉、vendor 体积异常。
立即学习“PHP免费学习笔记(深入)”;
- 打开项目所有
src/和app/下的 PHP 文件,全局搜索use和new,凡出现的第三方类,其包必须在require里 - 只在
tests/、bin/或 GitHub Actions 脚本里出现的工具(如phpunit/phpunit、phpstan/phpstan),必须进require-dev - 验证方法:
composer install --no-dev && php -r "new AppHttpController();"能成功实例化,才说明运行时依赖完整
发布前必须打 Git tag,且格式为 x.x.x
Packagist 不读 GitHub 的分支名,只认符合 SemVer 的 tag。没 tag = 没版本 = 别人 require 时只能写 "dev-main",这等于放弃语义化版本控制。
- 本地 commit 后,执行
git tag v1.0.0(注意v前缀和三位数字) -
git push --tags推送到 GitHub - 登录 Packagist,提交仓库 URL,它会自动抓取 tag 并生成版本列表
- 后续每次功能新增用
v1.1.0,bug 修复用v1.0.1,破坏性变更才升v2.0.0
最容易被忽略的是:命名空间末尾反斜杠、dump-autoload 忘执行、tag 漏推——这三个点卡住,包就只是个本地文件夹,不是可复用的组件。



















