运行composer config repositories验证当前生效仓库,若仅显示{"packagist.org": true}或为空,则配置未被读取;需检查composer.json中repositories字段拼写、json语法及数组格式,并确认全局配置满足repo.packagist、type=composer、url以/结尾三要素。

修改完composer.json里的repositories字段或执行了composer config命令,但composer install/update依然连packagist.org、找不到私有包、报invalid repository或404——这不是网络慢或镜像延迟,是配置根本没被Composer读取或主动跳过。
验证当前生效的仓库源
运行composer config repositories,查看输出的URL列表。如果只看到{"packagist.org": true}或空数组,说明项目级配置未写入或被覆盖。
用grep -A10 '"repositories"' composer.json检查文件里是否真有该字段。常见陷阱:字段名拼错成repository(少s)、缩进错误导致JSON解析失败、或写成了对象"repositories": {}而非数组"repositories": []。
若输出含URL但不是你配的镜像,立刻执行composer config --unset repositories清空项目级设置,再重试全局配置。
全局镜像配置三要素缺一不可
执行composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/时,必须同时满足:
① 键名严格为repo.packagist(单数,不能是repos或repositories);
② 第三参数必须是composer(type值),漏掉它整条配置静默失效;
③ URL必须以/结尾且为HTTPS,例如https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(会拼出/composerpackages.json导致404)。
【必须加-g】不加-g只改当前目录composer.json,换项目即失效;CI环境若用root配而实际运行用户是www,得用sudo -u www composer config -g单独配。
验证是否成功:运行composer config -g repo.packagist,输出必须是完整JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};空、null、字符串URL或报Key not found,立刻重试。
项目级repositories屏蔽全局配置
只要composer.json里存在"repositories"字段(哪怕内容是[]或{"packagist": false}),全局repo.packagist就会被彻底跳过,且不提示、不报错。
方法一:临时禁用项目级源,运行composer config --unset repositories(注意无-g),再执行composer install -vvv,观察日志首行Downloading的域名是否为你配的镜像。
方法二:保留私有源的同时启用镜像,在composer.json的repositories数组最前面插入:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},并确保它排在所有vcs或package类型源之前。
方法三:显式关闭隐式packagist.org源,避免路由混乱——在repositories数组中补上:{"type": "composer", "url": "https://packagist.org", "packagist": false},否则加一条vcs仓库后,Composer默认不再查Packagist。
手动测源地址真实可达性
对type: "composer"源,执行curl -I https://mirrors.aliyun.com/composer/packages.json,必须返回HTTP/2 200且响应头含Content-Type: application/json;若返回HTML页面(如人机验证),该镜像不适合CI自动化。
对type: "vcs"源,执行git ls-remote -h https://gitlab.example.com/myorg/sdk.git,能列出分支才说明Git地址真正可达;填错URL(如缺.git后缀、写成网页链接)会导致Composer静默跳过该仓库。
别只看composer config输出,composer install -vvv 2>&1 | head -n 10 | grep Downloading显示的第一行URL才是Composer实际发请求的目标地址。
清除缓存强制重载元数据
Composer默认复用本地packages.json缓存(15分钟内不过期),即使镜像站已同步新包,你机器上读的仍是旧数据。
第一步:执行composer clear-cache清空全部缓存;
第二步:删除项目根目录下的composer.lock文件;
第三步:运行composer install重新生成lock文件并拉取最新元数据。











