composer path仓库配置必须准确:url需指向含composer.json的目录,name须与require完全一致,改代码需composer update重建软链接,生产环境必须移除path配置,模块间依赖须通过独立contracts包解耦。

path仓库配置必须写对,否则Composer根本找不到本地包
最常见的错误是 composer.json 里漏掉 repositories 字段,或者 url 指向了错误层级。Composer 不会自动扫描子目录,它只认你明确声明的路径下的 composer.json 文件。
-
url必须指向**包含composer.json的目录**,比如"./packages/auth",而不是"./packages/auth/src"或"./packages" - 本地包的
composer.json中name字段必须和主项目require里的键完全一致,包括 vendor 名、大小写、连字符——"myorg/auth"和"MyOrg/Auth"是两个不同包 - 本地包
composer.json至少要有name和autoload(哪怕空),否则 Composer 解析失败,报Could not find a matching version of package myorg/auth - 路径支持相对路径(推荐)和绝对路径,但不支持
~、$HOME或通配符如../packages/*(除非每个子目录都单独配一条 repository)
改了本地代码没生效?不是缓存问题,是没重建软链接
很多人以为要 composer dump-autoload 或清 vendor,其实根本不需要——path 类型默认创建的是符号链接,只要链接存在,改源码就立刻可见。但前提是链接得是新的。
-
composer install只在vendor缺失时创建链接,已有链接不会更新目标路径 - 必须执行
composer update myorg/auth(指定包名),才会重新读取本地composer.json并重建 symlink - 检查是否真链接成功:
ls -la vendor/myorg/auth(Linux/macOS)或dir vendor\myorg\auth(Windows),输出里要有->或<symlink></symlink> - 如果还是复制而非链接,确认本地包
composer.json有"options": {"symlink": true},且 Composer 版本 ≥ 2.2;Windows 还需开启开发者模式或以管理员身份运行
生产环境部署前必须移除 path 配置,否则直接报错
CI/CD 流水线或线上服务器上不存在 ./packages/auth 这种路径,Composer 找不到就会中断安装,且**不会自动 fallback 到 Packagist**。
- 不要把
repositories中的path条目提交到 git 主干分支,开发用的配置不该污染生产环境 - 推荐做法:用构建脚本在 CI 环境中动态 patch
composer.json,删掉repositories里所有type: "path"的项 - 更稳妥的替代方案是使用
studio工具,它通过临时修改composer.json实现覆盖,且不写入版本控制 - 如果坚持保留配置,至少加个条件判断:用环境变量控制是否加载,例如在脚本里
if [ "$ENV" = "dev" ]; then ...
模块间不能 new 实例或调用 Facade,契约必须抽离到独立 contracts 包
物理路径隔离了,逻辑耦合还在,那拆包就白干了。最典型的破防点就是 new App\Services\OrderService() 或 Auth::user() 这类硬编码依赖。
- 所有跨模块能力(用户、通知、支付、日志)必须先定义接口,比如
UserServiceInterface,放到独立的myorg/contracts包里 -
myorg/contracts只含接口和 DTO,不能有任何实现,也不能 require 框架类(如Illuminate\Support\Facades\*) - 业务模块(如
myorg/auth)只requiremyorg/contracts,并通过容器绑定具体实现;主项目负责注册绑定 - 模块内禁止使用
Illuminate\Support\Facades\*,否则一跑就报IlluminateContractsContainerBindingResolutionException—— 容器还没注册这个 facade
Could not find package 上。这些都不是 Composer 不行,是路径没对、链接没刷、环境没切、契约没抽——每一步都得落在实处。











