composer install通过硬匹配识别path仓库:逐条读取根composer.json中repositories的"type":"path"条目,确认url为目录路径并检查其内composer.json的name字段与require包名完全一致。

composer install 不会自动感知本地目录变更,它只按 composer.lock 和根 composer.json 的 repositories 配置“照单链接”。所谓“auto reference”根本不存在——链接是否生效、指向哪里、类能否加载,全靠三步手动对齐:路径声明、name校验、autoload刷新。
path仓库怎么被composer install识别到
不是扫描硬盘,也不是监听文件变化,而是硬匹配:composer install 启动时,逐条读取根 composer.json 中 repositories 数组里 "type": "path" 的条目,对每个 url 值做两件事:
- 确认该
url是一个**目录路径**(不能是composer.json文件本身) - 进入该目录,检查是否存在合法的
composer.json,且其中name字段必须与你require里的包名(如acme/utils)**完全一致**(包括大小写、vendor 名、斜杠)
常见失败点:
-
Could not find a matching version of package acme/utils→ 八成是repositories没配,或本地目录下压根没放composer.json,或name写成了acme/utils-dev - 用了通配符如
"../packages/*"→ 每个子目录都得有独立composer.json,少一个就跳过整个匹配 - Windows 下路径写成
..packagesutils→ 必须用正斜杠../packages/utils,反斜杠会被当成转义
为什么 vendor 里是 symlink 而不是复制文件
这是默认行为,但有两个隐藏前提:
- 操作系统支持
symlink(Linux/macOS 默认 OK;Windows 需开启开发者模式或以管理员运行终端) - 本地包未被标记为
"dist"类型(即没在它的composer.json里设"type": "library"+"dist"字段)
验证是否真链接成功:
- Linux/macOS:
ls -la vendor/acme/utils,输出含->即为软链 - Windows:
dir vendorcmeutils,看到<symlinkd></symlinkd>或路径末尾带[Target: ...]
想强制复制?在项目根 composer.json 的 config 里加:
"preferred-install": {
"acme/utils": "dist"
}
注意:CI/CD 环境中必须删掉 repositories 里的 path 条目,否则构建必然失败——目标路径根本不存在。
改了本地包代码,为什么 new 类报错 Class not found
因为 symlink 指向对了,但 autoload 映射没更新。Composer 的自动加载不依赖文件物理位置,而依赖 vendor/composer/autoload_psr4.php 这类生成文件里的映射数组。
- 本地包的
composer.json里写了"psr-4": {"Acme\": "src/"}→ 这只是“声明”,不是“生效” - 主项目不会自动把
acme/utils的src/加进自己的 autoload 路径 - 必须在主项目中运行
composer dump-autoload,才会重新读取所有已安装包的 autoload 配置,并合并进映射表
顺带一提:composer install 不触发 autoload 刷新,composer update 也不自动触发——它只管依赖解析和链接重建。autoload 是单独的一层,要自己动手刷。
composer update vendor/name 和无参 update 的关键区别
本地包改完代码后,必须用 composer update acme/utils,而不是 composer update:
-
composer update acme/utils→ 只重新解析这个包的 path 路径、校验name、重建 symlink、并触发该包 autoload 配置的重载(如果它有) -
composer update(无参数)→ 全量重算所有依赖,可能升级其他包版本,引入意外 break change,且更慢 - 首次引入用
composer require acme/utils:dev-main→ 也会创建 symlink,但前提是repositories已配置好
真正容易被忽略的是:path 仓库的“自动性”全是假象。它不 watch、不 hot-reload、不智能推导——所有环节都依赖你手写对齐配置、手动触发命令、并在不同阶段分清 install/update/dump-autoload 的职责边界。











