path仓库能彻底绕过下载,因它强制Composer本地读取元数据并建符号链接,零HTTP请求、零解压、零复制;需满足name严格匹配、相对路径正确、本地包含git commit三条件。

直接用 type: "path" 仓库,本地包改完代码立刻生效,完全不走下载流程——这才是真·避免重复下载,不是靠缓存“省一点”。
为什么 path 仓库能彻底绕过下载
Composer 默认从 Packagist 或其他远程源拉包,而 type: "path" 明确告诉它:“别联网,去我本机这个路径找”。只要本地包目录存在、有合法 composer.json,Composer 就直接读取元数据并建立符号链接(默认行为),整个过程零 HTTP 请求、零压缩包解压、零 vendor 复制。
- 不触发任何
dist或source下载逻辑,composer install输出里看不到Downloading或Cloning - 即使你删了全局缓存(
~/.composer/cache),也不影响安装——因为根本没用到缓存 - 适合 CI 中快速验证本地包改动,比如 GitLab CI 里
git clone本地包后直接composer install
path 仓库配置的三个硬性条件
少一个,Composer 就会 fallback 到远程源或报错,而不是静默失败。
-
name字段必须和主项目require中的包名**完全一致**,包括大小写和斜杠,例如本地包composer.json里写"name": "acme/utils",主项目就得写"acme/utils": "dev-main" -
url必须是**相对于主项目composer.json的显式路径**,如"../acme-utils";不能用~/、$HOME或环境变量 - 本地包目录下必须已执行过
git init并至少有一个commit,否则 Composer 拒绝 symlink,自动退化为 copy 模式(且不报错)
如何确认真的没下载、用了 symlink
别只看命令输出是否快,得验证实际行为。
- 运行
ls -l vendor/acme/utils(macOS/Linux)或dir vendor\acme\utils(Windows),看到-> ../acme-utils或<symlinkd></symlinkd>才算成功 - 如果看到普通文件夹、里面是完整副本,说明 fallback 到 copy 了:检查是否漏了
git init、权限是否不足、或主项目config里写了"symlinks": false - 临时关闭某个本地包?直接删掉本地包目录即可——
composer install会跳过它,不报错也不下载,比注释repositories更干净
多个本地包怎么避免每个项目都配 repositories
全局配一次通配路径,所有项目自动继承,不用再碰每个 composer.json。
- 执行:
composer config -g repositories.acme-dev '{"type":"path","url":"~/dev/acme/*"}' -
url中的*会匹配~/dev/acme/下所有含合法composer.json的子目录,每个子目录就是一个可被 require 的包 - 注意:全局配置不会覆盖项目级
repositories,但优先级低于项目级;若两者冲突,以项目级为准
真正容易被忽略的是 symlink 的 fallback 行为——它不报错、不警告,只默默复制一份,结果你改了本地包代码却在项目里看不到效果,还以为是缓存问题。验证方式永远比猜更可靠。


















