确认当前真正生效的源需按顺序检查:环境变量(COMPOSER_REPO_PACKAGIST)、项目级 repositories(composer config repo.packagist)、全局 repos.packagist(composer config -g repos.packagist);最终以 composer require --no-install -vvv 日志中 Downloading 的 URL 为准。

还原 Composer 镜像到官方源不是“一键回滚”,而是精准清除或覆盖三层配置中生效的那个,再清缓存——漏掉任一环节都会导致 composer install 仍走镜像。
怎么确认当前真正生效的源?别只信 composer config -g
Composer 查源顺序是:环境变量 > 当前项目 composer.json 中的 repositories > 全局配置(~/.composer/config.json)。只运行 composer config -g repo.packagist 可能完全看不到真实生效项。
- 查项目级实际生效源:
composer config repo.packagist(不加-g) - 查全局配置里是否存在
repos.packagist(注意是复数repos):composer config -g repos.packagist - 查环境变量是否强制指定:
env | grep COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows) - 验证真实请求地址:运行
composer require monolog/monolog --no-install -vvv,滚动日志中找Downloading https://开头的行——正确应为https://repo.packagist.org
composer config -g --unset repos.packagist 为什么常失效?
因为字段名、作用域、版本逻辑全对不上。Composer 2.x 全局镜像配置用的是 repos.packagist(复数),但很多教程教的是 repo.packagist(单数),这两个字段并存也不冲突,删错一个等于没动。
- 执行
composer config -g --unset repo.packagist→ 白删,repos.packagist还在 - 漏掉
-g→ 只删当前项目composer.json,换目录就恢复 - 删完不运行
composer clear-cache→ 缓存里的packages.json还是镜像快照,composer update会解析错版本 - 某些旧脚手架写的是
"repositories": {"packagist.org": false}→ 删repos.packagist没用,得手动删整个repositories块
最稳的还原操作:覆盖而非删除
直接设回官方地址,绕过所有字段名歧义和 fallback 判断,兼容 Composer 2.0+ 所有小版本。
- 全局切回官方源:
composer config -g repo.packagist composer https://packagist.org - 仅当前项目临时切回:
composer config repo.packagist composer https://packagist.org - 必须清缓存:
composer clear-cache - 验证是否生效:
composer show -p输出首行 URL 应为https://packagist.org/packages.json
项目级 repositories 会彻底屏蔽全局设置
哪怕你全局删干净、环境变量也清空,只要当前项目 composer.json 里有 "repositories" 字段,它就优先生效。这不是 bug,是设计行为。
- 检查方式:
grep -A 5 '"repositories"' composer.json(Linux/macOS)或直接打开文件搜索 - 安全清空:
composer config --unset repositories(不加-g,只作用于当前项目) - 若字段值是
{"packagist.org": false},删掉整个repositories块更稳妥 - CI 或发布开源包前务必确认此项,否则依赖解析可能失败
最容易被忽略的点:缓存不清理 = 配置白改;环境变量未 unset = 全局配置全作废;项目级 repositories 存在 = 全局一切操作无效。三者缺一不可。


















