本地开发必须用path仓库,禁用composer link;需在laravel项目composer.json中配置repositories,url为相对或绝对路径,目标目录含合法composer.json,require时必须加@dev后缀,改代码后须执行composer dump-autoload -o更新autoload映射。

本地开发必须用 path 仓库,别碰 composer link
在 Laravel 项目里直接 composer require 远程包,改一行代码就得 composer update、清缓存、重启服务——根本没法调试。真实开发中,path 仓库是唯一靠谱的本地加载方式,composer link 在 Laravel 10+ 和 Windows 下大概率触发 autoload 冲突,类找不到、Provider 不注册、dump-autoload 报错都是常态。
关键点就三个:
-
repositories必须加在 Laravel 项目的composer.json里,不是包自己的 -
url值必须是**绝对路径或相对于项目根目录的相对路径**,比如"../packages/acme/laravel-demo" - 目标目录(即包所在目录)下必须已有合法的
composer.json,且已执行过composer install或至少composer dump-autoload
path 仓库配置后,require 一定要带 @dev
不加 @dev,Composer 默认找 stable 版本,而你本地包的 composer.json 里通常没设 "version",也没打 Git tag,结果就是 Could not find a matching version。
正确命令是:
composer require acme/laravel-demo:@dev
如果报错提示 “no matching package found”,先检查:
- 包目录下的
composer.json是否有"name"字段,且格式为vendor/name(如"acme/laravel-demo") - Laravel 项目
composer.json的repositories是否拼写正确,type是"path"不是"vcs"或漏写 - 执行
composer clear-cache后重试——缓存有时会卡住旧失败记录
改完包代码,Laravel 不生效?先看 autoload 和 symlink
用 path 仓库加载后,Composer 实际建的是符号链接(symlink),指向你本地包目录。但 Laravel 的自动加载只认 vendor/autoload.php 里的映射,它不会自动感知 symlink 目录里的文件变更。
所以每次改完包的 src/ 或 config/,必须手动刷新 autoload:
composer dump-autoload -o
注意:-o(optimize)不能省——没有它,PSR-4 映射可能不更新,新类仍加载失败。另外确认你的包 composer.json 中 autoload.psr-4 指向正确,例如:
"autoload": {
"psr-4": {
"Acme\Demo\": "src/"
}
}
如果命名空间写成 "AcmeDemo"(反斜杠),Windows 下可能解析异常;统一用正斜杠或双反斜杠。
Provider 不自动注册?检查 type 和 extra 配置
即使 path 加载成功、autoload 刷新了,Provider 也可能没被发现——Laravel 的自动发现机制只扫描 "type": "laravel-package" 的包,并读取 extra.laravel.providers。
两个路子任选其一:
- 显式声明:
"type": "laravel-package"+"extra": {"laravel": {"providers": ["Acme\Demo\DemoServiceProvider"]}} - 或依赖自动发现:确保 Provider 类继承
IlluminateSupportServiceProvider、放在src/根目录、类名与文件名一致(如DemoServiceProvider.php),且type是laravel-package
别信 "dont-discover": [] 能打开自动发现——它只起屏蔽作用;真正启用靠的是 type + extra.laravel.providers 或规范命名位置。
最后提醒一句:config/app.php 里手动加 Provider 是临时方案,发布前必须删掉,否则别人装你的包会重复注册。











