本地包必须在主项目composer.json根级配置repositories,name、路径、版本三者严格匹配,否则Composer静默跳过;路径需相对主项目,末尾不加/;name大小写及符号敏感;version建议dev-main并初始化Git;启用symlink需在本地包composer.json中设"options":{"symlink":true};autoload须独立配置并执行dump-autoload。

必须在主项目 composer.json 根级配置 repositories,本地包的 name、路径、版本三者严丝合缝,否则 Composer 静默跳过——不是没装上,是根本没解析到你这个包。
本地包仓库必须写在主项目 composer.json 的根级 repositories 字段
Composer 只读主项目 composer.json 最外层的 repositories,其他位置全无效。常见错误包括:
- 把
repositories塞进require、autoload或config里——完全不解析 - 在本地包自己的
composer.json里写repositories——对主项目毫无作用 - 用绝对路径(如
"C:/dev/my-pkg")或file://前缀——应使用相对于主项目composer.json的路径,例如"../my-pkg" -
url指向的是目录,不是composer.json文件本身;末尾不能加/("../my-pkg/"会静默失效)
本地包的 name 和 version 必须逐字匹配且合法
Composer 不认“目录存在”,只认 name 和 version 字段是否合规。90% 的失败源于这里:
-
name必须和require中写的**完全一致**:大小写、短横线-、斜杠/全部敏感("acme/utils"≠"Acme/utils"≠"acme_utils") -
version建议显式写"dev-main"(尤其未初始化 Git 时),避免依赖分支推断 - 本地包目录下必须有语法合法的
composer.json(无尾逗号、全双引号、JSON 格式正确) - 若要用
dev-main,本地包目录下需有 Git 仓库(至少git init && git add . && git commit -m "init")
启用 symlink 才能实时生效,但配置点不在主项目
默认行为是复制(copy),改本地代码不会反映到 vendor/。要热更新,关键不是主项目配 "symlink": true,而是:
- 在本地包自己的
composer.json里加:"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端,否则 symlink 创建失败且无提示
- 首次引入必须用
composer update vendor/name(不是install),因为install只读lock文件 - 验证是否真链接成功:
ls -la vendor/vendor/name(Linux/macOS)应看到->;Windows 上dir vendorendor ame应显示 “JUNCTION” 或 “快捷方式”
autoload 映射必须独立配置且手动刷新
path 仓库让包“装进去”,但类能否 use 或 new,取决于 autoload 是否映射到真实路径:
- 本地包
composer.json必须包含合法的autoload字段(如"psr-4": {"Acme\Utils\": "src/"}) - 主项目执行
composer dump-autoload后,才能识别本地包里的命名空间 - 如果本地包依赖其他包(比如它自己 require 了
guzzlehttp/guzzle),这些依赖仍由主项目统一解析安装,无需额外操作
最容易被忽略的是:所有路径都必须是相对主项目 composer.json 的,且 name 匹配失败时 Composer 不报错,只安静跳过——你得自己检查 vendor/ 目录是否存在对应文件夹,再反查路径和 name 是否拼写一致。











