composer镜像源与git refspec无关,其核心机制是缓存packagist元数据并下载dist包;配置镜像需三步:设type为composer、指定带末尾斜杠的url、清缓存,缺一不可。

Composer镜像源不等于Git Refspec,别混用
Composer 镜像源和 Git 的 refspec 是两套完全独立的机制,强行套用 Git 的 +refs/heads/*:refs/remotes/origin/* 理解 Composer 镜像行为,会导致配置错、验证错、排查错。Composer 没有“远程分支映射”概念,它只做两件事:查元数据(packages.json)、下 dist 包(ZIP)。所谓“同步”,是镜像服务端定时拉取 Packagist 的 JSON 清单并缓存,不是 Git fetch。
为什么改了镜像还卡在 Resolving dependencies?
这不是 Refspec 没配对,而是 Composer 仍在读本地旧缓存里的海外元数据——它根本没向新镜像发请求。典型表现:
-
composer diagnose显示Repo packagist.org is default,哪怕你执行过composer config -g repo.packagist -
composer config -g repositories.packagist.org.url输出为空或仍是https://packagist.org -
composer show -a monolog/monolog列出的版本明显少于 Packagist 官网
必须三步一起做:composer config -g repositories.packagist.org.type composer、composer config -g repositories.packagist.org.url https://mirrors.aliyun.com/composer/、composer clear-cache。漏掉任意一条,都只是“看起来换了”。
私有包 + 自建镜像时,Refspec 式思维会误导你
有人想用 Git 的 refspec 逻辑去“映射”私有包路径,比如把 git@xxx:vendor/pkg.git 强行对应到镜像 URL 下某个子路径——这不可行。Composer 私有包依赖走的是 repositories 字段,类型为 vcs 或 package,和镜像源无关。自建镜像若要支持私有包,必须:
- 在镜像服务后端显式配置该私有仓库的同步规则(非 Refspec,是 HTTP webhook 或定时轮询)
- 项目
composer.json中仍需保留"type": "vcs"的repositories条目 - 不能指望镜像自动“代理”未声明的 Git 地址;
composer require vendor/pkg不会把git@地址转成镜像 URL
阿里云等公共镜像根本不处理私有 Git 仓库,它们只缓存 Packagist 公开包的 dist 和元数据。
镜像 URL 末尾的 / 是硬性要求,不是风格问题
https://mirrors.aliyun.com/composer 和 https://mirrors.aliyun.com/composer/ 在 Composer 里是两个不同地址。缺斜杠会导致:
- 路径拼接错误,例如请求
https://mirrors.aliyun.com/composerp2/monolog/monolog/2.8.0.json(少了个/,变成composerp2) - 返回 404 或 503,但 Composer 不报明确错误,只卡在
downloading -
composer config -g repositories.packagist.org.url看起来写进去了,实际请求时被截断
验证是否真生效,唯一可靠方式是运行 composer diagnose,确认输出中出现 Repo https://mirrors.aliyun.com/composer/ is default —— 注意末尾斜杠必须存在。这个细节,90% 的人第一次都会漏。











