必须覆盖为https://packagist.org或清空三层配置才生效;删错字段名、漏-g、未清缓存或环境变量残留均导致镜像未切换。

直接删掉所有镜像相关配置项不会自动恢复官方源,必须明确覆盖为 https://packagist.org 或清空三层生效层中的任意一层——否则 Composer 仍可能 fallback 到残留字段、项目级 repositories 或环境变量。
为什么 composer config -g --unset repos.packagist 常常没用
这个命令只删一个字段,但 Composer 实际读取的是三个独立层级:环境变量 > 当前项目 composer.json 中的 repositories > 全局 config.json。删错字段名(比如写成 repo.packagist 或 repositories)或漏掉 -g,都等于白操作。
-
repos.packagist(复数带 s)是 Composer 2.x 存储镜像 URL 的真实字段名;repo.packagist(单数)是旧版写法,两者共存时互不干扰 - 执行
composer config -g --unset repo.packagist不报错,但repos.packagist还在,镜像照常走 - 不加
-g就只删当前项目composer.json里的字段,对全局无效 - 删完不验证:运行
composer config -g repos.packagist应输出Key "repos.packagist" does not exist,否则说明没删干净
怎么真正切回单一官方源
最稳的方式不是“删除”,而是“覆盖”——强制指定唯一地址,绕过所有 fallback 判断逻辑。Composer 2.0+ 全版本都认这个写法:
- 全局生效:
composer config -g repo.packagist composer https://packagist.org(注意是单数repo.packagist,中间必须有composer类型标识,URL 末尾必须带/) - 仅当前项目临时生效:
composer config repo.packagist composer https://packagist.org(不加-g) - 如果项目
composer.json里已有repositories字段,它会完全屏蔽全局设置,此时得先运行composer config --unset repositories(同样不加-g)
环境变量和缓存是最大干扰源
即使你把全局和项目配置都弄对了,COMPOSER_REPO_PACKAGIST 环境变量仍能盖过一切;而缓存不清,Composer 就继续用旧镜像下载下来的 packages.json 快照,导致 composer update 找不到新包、版本号错乱。
- 检查是否被环境变量劫持:
echo $COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows),有输出就需unset COMPOSER_REPO_PACKAGIST或set COMPOSER_REPO_PACKAGIST= - 清缓存必须做:
composer clear-cache,否则所有配置变更都只是纸面功夫 - 验证是否真走官方源:
composer require monolog/monolog --no-install -vvv,滚动日志里找Downloading https://repo.packagist.org/,不是mirrors.aliyun.com或其他镜像域名
别信“配置已删”,要查三层实际生效值
Composer 查源顺序是硬编码的:环境变量 > 项目级 repositories > 全局 repo.packagist。你改的那层可能根本没被读到。
- 查当前项目实际用的源:
composer config repo.packagist(不加-g) - 查全局配置:
composer config -g repo.packagist - 查环境变量:
env | grep COMPOSER_REPO_PACKAGIST(Linux/macOS) - 只要其中任一输出是镜像地址,你就还没切干净
最常被忽略的是项目级 repositories 里写了 "packagist.org": false 这种禁用默认源的写法——它不依赖任何镜像 URL,删全局配置毫无意义,必须手动编辑 composer.json 或用 composer config --unset repositories 彻底清除。











