path仓库必须写在主项目composer.json最外层repositories数组中,且每项type为"path"、url为相对路径(如"./packages/hoo-log"),本地包需含合法name、git初始化及PSR-4 autoload配置。

path仓库必须写在主项目composer.json最外层repositories里
Composer只认主项目根目录下composer.json最外层的repositories字段,其他位置写的全无效。常见错误是把它塞进config、require甚至注释里,结果composer install静默跳过,连报错都没有。
多个模块要并列声明,不能合并成一个对象:
{
"repositories": [
{ "type": "path", "url": "modules/user" },
{ "type": "path", "url": "modules/payment" },
{ "type": "path", "url": "modules/logging" }
],
"require": {
"myapp/user": "*",
"myapp/payment": "*",
"myapp/logging": "*"
}
}
-
url必须是相对于主项目composer.json的路径,不能用~/或环境变量 - 每个
url指向的必须是含合法composer.json的目录,不是文件,末尾不能带/ - 数组顺序即匹配优先级——想让本地模块优先于Packagist,私有源必须放第一位
每个模块自己的composer.json必须有name且与require完全一致
“完全一致”指大小写、分隔符(仅短横线-)、vendor名全部逐字匹配。"myapp/user" ≠ "MyApp/user" ≠ "myapp_user"。一旦不一致,composer show --all里根本看不到这个包,Could not find package就是唯一提示。
- 模块目录下
composer.json至少要有{"name": "myapp/user", "autoload": {"psr-4": {"MyApp\User\": "src/"}}} - 不需要写
version字段,用"*"或"dev-main"即可;若想强制走本地源,可统一用"@dev" - 模块目录必须是Git仓库(
git init && git add . && git commit -m "init"),否则Windows下symlink会失败
启用symlink需在模块自己的composer.json里加options
是否创建符号链接,不由主项目控制,而取决于**模块自身的composer.json**。漏掉这句,Linux/macOS可能侥幸成功,Windows和Docker里大概率fallback到复制模式——你改了代码,vendor/myapp/user里还是旧文件,调试卡死都不知道为什么。
在模块根目录的composer.json中加入:
{
"name": "myapp/user",
"options": {
"symlink": true
}
}
- Windows用户必须以管理员身份运行终端,否则
symlink创建失败且无任何提示 - Docker容器需加
--cap-add=SYS_ADMIN,且挂载方式要支持符号链接(如docker run -v $(pwd)/modules:/app/modules) - 验证是否真链接:
ls -la vendor/myapp/user(看到->)或dir vendormyappuser(看到JUNCTION)
autoload映射失效时得手动dump-autoload
path仓库让包“存在”,但类能不能new、能不能use,取决于自动加载映射是否包含模块的真实路径。Composer不会自动感知模块composer.json里autoload段的变更。
- 改完模块的
autoload配置后,必须在主项目执行composer dump-autoload -o - Xdebug断点打不中?检查IDE里设置的路径是否和
ls -la vendor/myapp/user显示的真实磁盘路径一致 - 如果模块用了
filesautoload类型,也要重新dump-autoload,否则函数无法被找到
autoload命名空间不能冲突,且主项目composer.json里不能漏掉"minimum-stability": "dev"——否则"*"或"dev-main"会被拒绝解析。


















