执行 composer config -g repo.packagist composer https://packagist.org 即可强制全局恢复官方源,需配合 composer clear-cache 并检查项目级 repositories 配置与环境变量覆盖。

直接执行这条命令就能恢复官方源
执行 composer config -g repo.packagist composer https://packagist.org,Composer 就会立刻走官方源。这不是“删掉再等它自动回退”,而是明确告诉它:“以后所有包元数据,都从这个地址拿”。相比 composer config -g --unset repos.packagist,它更可靠——尤其在 Composer 2.2–2.4 这些旧小版本里,--unset 可能触发 fallback 失败,导致 composer update 卡住或报 Could not parse version constraint。
- 全局生效:加
-g,改的是~/.composer/config.json(Linux/macOS)或C:\Users\用户名\AppData\Roaming\Composer\config.json(Windows) - 项目级临时恢复:不加
-g,进项目目录后运行composer config repo.packagist composer https://packagist.org - 别写成
repos.packagist(带 s):那是老写法,新版本只认repo.packagist;写错字段名不会报错,但配置无效
为什么改了还不生效?检查三层覆盖关系
Composer 查源顺序是:环境变量 > 当前项目配置 > 全局配置。哪怕你全局设对了,只要项目 composer.json 里有 "repositories" 块,它就优先用那个。
- 查项目是否自定义了源:
grep -A 5 '"repositories"' composer.json(Linux/macOS),或直接打开composer.json看有没有"repositories"字段 - 查当前实际生效的源:
composer config repo.packagist(不带-g),如果输出还是阿里云地址,说明项目级配置盖掉了全局设置 - 极端情况:检查是否有
COMPOSER_REPO_PACKAGIST环境变量,运行env | grep COMPOSER_REPO,有就unset COMPOSER_REPO_PACKAGIST
缓存不清理,等于白换源
换源后不运行 composer clear-cache,Composer 仍会读取旧镜像缓存下来的 packages.json 快照——结果就是 composer update 找不到新包、版本号对不上、锁文件更新失败。
- 验证缓存是否清干净:
ls -la ~/.composer/cache/应该为空或只剩空子目录 - 换源 + 清缓存后,用
composer require monolog/monolog --no-install -vvv观察日志:下载元数据的 URL 必须含https://repo.packagist.org,不能是mirrors.aliyun.com或其它镜像域名 - 如果仍走镜像,八成是项目
composer.json里还留着"repositories",得手动删掉整段,或用composer config --unset repositories清除
误删或删错配置怎么办
Composer 没有 undo 或“恢复默认值”机制。config --unset 就是硬删 JSON 字段,删完就没了,不会回填任何默认内容。
- 删错全局配置?只能手动编辑
~/.composer/config.json,把整个"repositories"或"repo"相关字段补回去,或干脆删掉整个文件(Composer 会在下次运行时重建一个最小配置) - 不确定删没删干净?运行
composer config -g repo.packagist和composer config -g repos.packagist,两者都应返回空或报错Key "xxx" does not exist - 别指望“unset 后自动继承默认值”:比如
secure-httpunset 后默认为true,但minimum-stabilityunset 后不会变回stable,而是直接报错,必须手动设
换源这事本身很简单,真正卡住人的,永远是缓存、项目级配置和字段名拼写这三处。











