Laravel包要实现composer require后自动注册并支持vendor:publish,核心是三处对齐:PSR-4 autoload路径与命名空间严格匹配、extra.laravel.providers显式声明完整类名、服务提供者类名规范且位于autoload覆盖路径下。

能直接 composer require 安装、自动注册服务提供者、支持 php artisan vendor:publish 的 Laravel 包,核心不在代码多复杂,而在三处配置必须对齐:目录结构、composer.json 的 autoload 和 extra 字段、服务提供者类名与命名空间。
composer.json 里这三项不能漏
一个包发布后被别人 composer require 安装却没反应,90% 出在 composer.json 配置不完整:
-
"autoload": { "psr-4": { "YourVendor\YourPackage\": "src/" } }—— 路径和命名空间必须严格匹配,比如src/Providers/YourPackageServiceProvider.php对应的命名空间就得是YourVendorYourPackageProviders -
"extra": { "laravel": { "providers": ["YourVendor\YourPackage\Providers\YourPackageServiceProvider"] } }—— 显式声明服务提供者,Laravel 9+ 默认启用自动发现,但显式写死更可靠,尤其当你用laravel/dont-discover屏蔽过某些包时 -
"type": "library"或"type": "laravel-package"—— 不是必须,但部分工具链(如 Packagist)会据此做分类,建议设为library
服务提供者类名和位置必须规范
Laravel 自动发现机制只扫描以 ServiceProvider 结尾的类,且只认 src/ 下的类(或你 autoload 指定的路径)。常见失效场景:
- 类文件叫
MyService.php或MyProvider.php—— 必须是MyPackageServiceProvider.php - 类放在
src/Support/下,但 autoload 没覆盖该子目录 —— 自动发现找不到,php artisan vendor:publish就不会列出你的包 -
register()里用了$this->app->bind(),但boot()没调用$this->mergeConfigFrom()或$this->publishes()—— 配置文件不会被加载,config('your-package')返回 null
本地测试阶段别跳过 path 仓库方式
直接 push 到 GitHub 再 composer require 测试太慢,容易反复提交无效版本。推荐在主项目 composer.json 里加 path 仓库:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
"repositories": [
{
"type": "path",
"url": "../packages/your-vendor/your-package"
}
]
然后运行 composer require your-vendor/your-package --dev。这样改完包代码,主项目 composer dump-autoload -o 就能立刻生效,不用等 Packagist 同步。
注意:../packages/your-vendor/your-package 目录下必须有完整的 composer.json,且已执行过 composer install;否则 composer require 会报 Could not find a matching version。
发布到 Packagist 前最后验证三件事
Packagist 是只读镜像,它从你填的 Git URL 抓取 tag。发布前务必确认:
- Git 仓库已创建,远程地址正确,且
git tag v1.0.0已打并git push --tags -
composer.json中的"name"字段(如"your-vendor/your-package")和 Packagist 提交的 URL 里的用户名/仓库名完全一致,大小写都不能错 - 在干净的 Laravel 项目中执行
composer require your-vendor/your-package后,运行php artisan vendor:publish --provider="YourVendor\YourPackage\Providers\YourPackageServiceProvider"能成功复制配置文件 —— 这是真正可用的最小闭环
最容易被忽略的是:Packagist 不会自动更新已提交包的 metadata,改了 composer.json 里的 description 或 keywords,得手动点 “Update” 按钮,否则新用户看到的还是旧信息。

















