还原 Composer 镜像源需精准删除全局配置项 repos.packagist(非 repo.packagist)、清缓存并逐层排查环境变量、项目级 repositories 和 packagist 禁用设置,任一遗漏均导致仍走镜像。

还原 Composer 镜像源不是“恢复默认”操作,而是精准删除配置项 + 清缓存 + 排查覆盖层——漏掉任意一环都会导致仍走镜像。
为什么 composer config -g --unset repos.packagist 总不生效
根本原因是字段名错配:Composer 2.x 实际识别的是 repos.packagist(复数、带 s),而早期文档或脚本常误写为 repo.packagist(单数)。这两个键完全独立,删错一个,另一个照常生效。
- 执行
composer config -g --unset repo.packagist→ 白删,repos.packagist还在 - 漏掉
-g→ 只删当前项目composer.json里的repositories,不影响全局 - 删完不验证 → 看命令没报错就以为成功,但
composer config -g repos.packagist仍输出 URL
如何确认真正还原成功
不能只看配置命令输出,必须分两层验证:
- 查配置是否存在:
composer config -g repos.packagist应返回Key "repos.packagist" does not exist或空输出 - 查实际请求地址:
composer require monolog/monolog --no-install -vvv,观察日志中Downloading行的 URL —— 正确应为https://repo.packagist.org,不是mirrors.aliyun.com等任何镜像域名
若第二步仍见镜像地址,说明有更高优先级配置在起作用。
三层覆盖关系必须逐个排查
Composer 查源顺序是:环境变量 > 当前项目 composer.json 中的 repositories > 全局配置。哪怕全局删干净了,只要下面任一存在,就会覆盖:
- 项目级
repositories:运行grep -A 5 '"repositories"' composer.json(Linux/macOS)或直接打开文件搜索 - 环境变量:
echo $COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows) - 禁用 packagist 的极端情况:如
"packagist.org": false出现在repositories块里,删全局配置完全无效,必须手动编辑composer.json
CI/CD 或 Docker 构建中为何镜像设置总失效
CI runner(如 GitHub Actions)通常以 root 或 www-data 用户运行,它读取的是该用户的 ~/.composer/config.json,和你本地用户配置完全隔离。更隐蔽的是缓存残留:
- 构建镜像时未清理旧
vendor/和composer.lock→ Composer 直接按 lock 文件里的原始元数据地址拉包,根本不查新配置 - runner 复用缓存 → 即使改了配置,旧缓存仍被加载
- 推荐做法:在 CI 脚本开头加两行:
composer config -g repositories.packagist.org '{"type": "composer", "url": "https://mirrors.cloud.tencent.com/composer/"}'+composer clear-cache && rm -rf vendor/ composer.lock
最易被忽略的是:换源后不 clear-cache,等于没换;删配置后不查 composer config -g repos.packagist 和实际请求日志,等于白删。











