Composer镜像还原需覆盖+清理+验证三步闭环:先用composer config -g repo.packagist composer https://packagist.org覆盖为官方源,再composer clear-cache并删除vendor和composer.lock,最后通过grep "Downloading"确认请求地址为packagist.org。

还原 Composer 镜像不是删掉配置就完事——它必须绕过优先级陷阱、环境变量干扰和缓存残留,否则 composer install 仍会静默走镜像源。
为什么 composer config -g --unset repos.packagist 常常无效
这个命令本身没问题,但实际失效的常见原因很具体:
- 字段名写错:
repos.packagist(复数)是旧写法,而你之前配的是repo.packagist(单数),删错一个就白删 - 环境变量覆盖:
COMPOSER_REPO_PACKAGIST的值会直接压倒所有 JSON 配置,删完全局配置后它还在,照样生效 - 项目级
repositories字段存在:哪怕内容是空数组"repositories": []或只写了{"packagist.org": false},全局配置就完全被跳过 - PHP 进程没重载:Linux/macOS 下用
sudo composer config -g写进了/root/.composer/config.json,普通用户运行时根本读不到
真正可靠的还原操作顺序
不依赖“删”,而是用“覆盖 + 清理 + 验证”三步闭环:
- 先覆盖为官方源:
composer config -g repo.packagist composer https://packagist.org(注意是repo.packagist,不是repos) - 清掉所有缓存:
composer clear-cache,再删掉当前项目的vendor/和composer.lock(否则 lock 文件会固化旧元数据地址) - 检查三层配置是否干净:
— 当前项目:composer config repo.packagist应输出Key "repo.packagist" does not exist
— 全局:composer config -g repo.packagist应输出同上
— 环境变量:echo $COMPOSER_REPO_PACKAGIST(Linux/macOS)或echo %COMPOSER_REPO_PACKAGIST%(Windows)应为空
验证是否真走官方源的唯一方法
别信配置输出,盯住网络请求本身:
- 执行:
composer require monolog/monolog --no-install -vvv 2>&1 | grep "Downloading" - 正确结果里必须出现
https://repo.packagist.org/packages.json或https://packagist.org/packages.json,不能含任何镜像域名(如mirrors.aliyun.com) - 如果看到
Could not fetch https://repo.packagist.org/p2/...类报错,说明已切回官方源但网络不通——这不是配置问题,是本地连不上国外源
最易被忽略的点:CI/CD 构建中还原失败,往往是因为 runner 复用了旧缓存,或构建用户与配置用户不一致;此时必须在脚本开头显式执行覆盖命令,并强制清理缓存目录。











