path仓库必须配"",其他版本写法无效;Composer仅读取本地包composer.json的version字段,不解析^、~等符号;正确配置需在require中写"vendor/name": ""并声明type为"path"的repositories。

path仓库必须配"*",其他版本写法全无效
本地包走path类型仓库时,Composer根本不解析^、~、=或具体数字(如"1.2.3")。它只读取你本地包目录下composer.json里的version字段,并原样当作已安装版本。写"dev-main"或"^1.2"不仅没用,还会触发Skipped tag v1.2.0, no composer.json found这类警告。
正确做法只有一条:在主项目composer.json的require里写"vendor/name": "*",同时确保repositories中已声明type: "path"且url指向有效路径。
-
url必须是相对路径(如"./packages/my-pkg")或绝对路径,不能以/结尾 - 目标目录必须存在合法
composer.json,且其中name与require中完全一致(大小写敏感) - 本地包的
version字段决定最终加载的“版本号”,哪怕你写"*",它也只会照搬这个值
composer link不改composer.lock,也不同步autoload规则
composer link只是在vendor/下建个符号链接,绕过版本约束,但它不会更新composer.lock,也不会重新生成vendor/autoload.php中的类映射。这意味着:
- 下次运行
composer update可能直接把软链接覆盖成正常包,悄无声息回退 - 如果本地包改了
autoload配置(比如加了新的psr-4命名空间),主项目不会自动感知 - 该命令只对已通过
composer require安装过的包生效;没装过就跑composer link vendor/name会报错
真要用它,流程得是:composer require vendor/name → 进本地包目录执行composer link → 回主项目执行composer link vendor/name。
想“锁定”本地包内容,靠的是文件系统状态,不是版本字符串
path仓库模式下没有“版本发布”概念。你改一行代码、删一个函数,只要没提交 Git tag,composer update也不会察觉——因为它压根不查 Git,只读文件系统里的当前状态。
所以所谓“锁定”,实际靠的是:
- Git commit hash(手动切到某次提交再
composer update) - IDE 或 CI 中对本地包目录的权限/只读控制
- 团队约定不随意改
composer.json里的version字段(否则composer show看到的版本号会变)
别指望"*"能防误操作——它只是开关,不是锁。
常见错误现象和对应检查点
遇到Could not find package或Class not found,先盯住这三处:
-
repositories.url写成"https://..."或"git@..."→ Composer 当作 VCS 处理,跳过本地读取 - 本地包
composer.json里name是"my-vendor/my-pkg",但require里写成"myvendor/my-pkg"→ 大小写或连字符不一致,链接失败 - 主项目
composer.json里漏了repositories块,或type拼错成"pat"→ 配置无效,Composer 仍去 Packagist 查
最省事的验证方式:composer show vendor/name。如果输出里versions显示dev-main或类似分支名,说明走的是远程源;如果显示1.2.3 (path repo),才真正挂载成功。


















