答案是需按项目级>全局>默认源优先级逐层排查:先用composer config repos.packagist查项目配置,再用composer config -g repos.packagist查全局配置,接着grep -n "repositories" composer.json确认文件残留,最后检查环境变量composer_repo_packagist。

如何确认当前生效的镜像配置在哪一层
Composer 实际使用的源不是看 composer config -g repo.packagist 的输出,而是按优先级逐层匹配:项目级 composer.json > 全局 ~/.composer/config.json > 默认官方源。很多人删了全局配置却仍走阿里云,就是因为项目根目录的 composer.json 里还留着 "repositories" 字段。
先运行以下命令分层排查:
-
composer config -g repos.packagist—— 查全局是否设置了镜像(注意是repos.packagist,不是repo.packagist) -
composer config repos.packagist—— 不加-g,查当前项目是否覆盖 -
grep -n "repositories" composer.json—— 直接搜文件,确认有没有残留字段 -
echo $COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows)—— 检查环境变量是否强制指定
删全局镜像必须用正确的键名和参数
错一条就白操作:composer config -g --unset repos.packagist 是唯一推荐的命令。它精准删除 repos 对象下的 packagist 子项,不会误删你加的私有仓库。
常见错误包括:
- 写成
repo.packagist(单数)—— 旧文档写法,新版 Composer 已不识别,命令静默失败 - 漏掉
-g—— 只删当前项目配置,对全局无效 - 执行
composer config -g --unset repositories—— 这会清空整个repositories对象,连你自建的 Git 私仓都丢了 - Windows CMD 下用点号
.当路径分隔符导致解析异常 —— 建议改用 PowerShell 或 WSL
项目级配置必须手动清理 composer.json
哪怕全局删干净了,只要 composer.json 里还有 "repositories" 字段,Composer 就完全忽略官方源。这个字段可能长这样:
"repositories": {
"packagist.org": false,
"aliyun": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
}
正确做法是直接删掉整块 "repositories": { ... },不要只删里面的 URL。删完后运行 composer config repos.packagist 应该返回 “Key does not exist”。如果还存在,说明 composer.json 没保存或编辑错了位置(比如嵌套在 "extra" 里)。
验证是否真回到 packagist.org
别信配置命令的输出,要看真实 HTTP 请求:
-
composer diagnose -v末尾应显示Checking https://packagist.org/packages.json -
composer require monolog/monolog --no-install -vvv 2>&1 | grep -i 'GET https'(Linux/macOS),观察请求域名是不是repo.packagist.org - Windows 用户可用
composer install -vvv > log.txt,再打开log.txt搜索GET https
缓存不清理,旧镜像元数据还会被复用 —— 删完配置后务必立刻执行 composer clear-cache。否则即使配置清空了,第一次请求仍可能从本地缓存里拉出镜像地址。
最常被忽略的是 composer.lock 文件:它固化了包来源地址,删配置后不删锁文件,composer install 仍会尝试从镜像域名下载 zip 包,导致 hash 校验失败。稳妥做法是删掉 vendor/ 和 composer.lock,再跑 composer install。











