应逐层检查环境变量>项目级composer.json>全局配置;运行composer config repo.packagist查项目级地址,env | grep COMPOSER_REPO_PACKAGIST查环境变量,composer config -g repo.packagist查全局地址,换源后必须执行composer clear-cache并验证composer require -vvv日志中的实际请求URL。

怎么确认当前实际生效的镜像源
别只看 composer config -g 输出,Composer 实际读取顺序是:环境变量 > 项目级 composer.json 中的 repositories > 全局配置。运行 composer config repo.packagist(不加 -g)能直接看到当前项目真正用的地址;如果输出是 https://mirrors.aliyun.com/composer/,说明项目级配置已覆盖全局。再查环境变量:env | grep COMPOSER_REPO_PACKAGIST(Linux/macOS)或 echo %COMPOSER_REPO_PACKAGIST%(Windows),有输出就代表它在最顶层强制生效,必须先清除。
删配置还是覆盖?优先选覆盖
还原官方源的本质不是“删除字段”,而是让 Composer 回到默认行为——即自动使用 https://packagist.org。最稳的操作是直接覆盖为官方地址:
-
composer config -g repo.packagist composer https://packagist.org(单数repo.packagist,适用于所有 Composer 2.0+ 版本) - 若想保留历史痕迹或不确定删配置是否安全,这条命令比
--unset更可靠 - 注意 URL 必须带末尾斜杠:
https://packagist.org/无效,https://packagist.org才对
为什么 --unset 经常不生效
常见原因不是命令错了,而是字段名错位或残留干扰:
- Composer 2.x 实际识别的是
repos.packagist(复数、带s),而设镜像时常用repo.packagist(单数)——二者互不干扰,删错一个没用 - 旧项目可能同时存在两种写法,需分别执行:
composer config -g --unset repo.packagist和composer config -g --unset repos.packagist - 某些脚手架写过
"repositories": {"packagist.org": false},这等于关掉默认源又没给替代,删全局配置完全无效,得手动改composer.json - 漏掉
-g参数,只删了当前项目配置,对全局无影响
换源后必须清缓存并验证请求路径
缓存不清 = 白操作。Composer 会继续用旧镜像缓存的 packages.json,导致版本错乱、包找不到:
- 执行
composer clear-cache强制刷新本地缓存 - 验证真实请求路径:
composer require monolog/monolog --no-install -vvv,滚动日志中找Downloading https://开头的行——正确应含https://repo.packagist.org,不是任何镜像域名 - 如果仍见
mirrors.aliyun.com,说明某层(环境变量 / 项目repositories/ 错误字段)仍有残留,得逐层排查
最易被忽略的是项目级 repositories 配置——它一旦存在,就会彻底屏蔽全局 repo.packagist 设置,且不报错、不提示。哪怕你全局删干净了,只要 composer.json 里还写着 "repositories",它就优先生效。











