composer config -g repo.packagist 修改全局配置文件中的 repositories 字段,插入 packagist 源定义;键名必须为 repo.packagist(单数),写错不报错但无效;操作原子写入,但实际生效受环境变量、项目配置、全局配置三级优先级影响。

composer config -g repo.packagist 命令到底改了什么
它直接写入全局配置文件 %APPDATA%\Composer\config.json(Windows)或 ~/.composer/config.json(Linux/macOS),在 repositories 字段下插入一个名为 packagist 的源定义。注意键名必须是 repo.packagist(单数),不是 repos.packagist(复数)——写错不会报错,但配置完全不生效。
这个操作本身是原子的:Composer 2.0+ 写入时会先生成临时文件再原子替换原文件,避免配置损坏。但“原子”仅指文件写入过程,不等于“立即全局生效”——实际读取顺序受三层覆盖影响:
- 环境变量
COMPOSER_REPO_PACKAGIST(最高优先级,存在即强制使用) - 当前项目
composer.json中的repositories字段(会屏蔽全局设置) - 全局
config.json中的repo.packagist(最低优先级)
验证是否真走镜像源:别只看 config 输出
composer config -g repo.packagist 只显示全局配置值,不能代表实际请求地址。必须用网络层验证:
- 运行
composer require monolog/monolog --no-install -vvv - 滚动日志中找
Downloading https://开头的行 - 正确应出现
https://mirrors.tuna.tsinghua.edu.cn/composer/或你设的镜像域名,而非https://repo.packagist.org/
如果看到的是官方域名,说明被环境变量或项目级配置覆盖了。此时要查:
- Windows:
echo %COMPOSER_REPO_PACKAGIST% - Linux/macOS:
env | grep COMPOSER_REPO_PACKAGIST - 项目级:
composer config repo.packagist(不加-g)
换源后必做的两件事:clear-cache 和确认 classmap
缓存不清理,旧包元数据仍可能从本地缓存加载,导致 composer show -p 显示的 URL 是旧的,甚至安装失败。执行:
-
composer clear-cache(清空所有包元数据和 ZIP 缓存) -
composer show -p(首行输出应为镜像地址的/packages.json路径)
另外,镜像同步有延迟(通常
composer config -g repo.packagist composer https://packagist.org- 切回后仍需
clear-cache,否则可能继续命中旧镜像缓存
删配置不如覆盖:为什么 unset 容易失效
用 composer config -g --unset repo.packagist 看似合理,但 Composer 2.x 实际读取的是 repos.packagist(复数)。这两个字段并存且互不影响——删错一个,另一个照常生效。
最稳做法是覆盖而非删除:
- 切回官方源:
composer config -g repo.packagist composer https://packagist.org - 切回清华镜像:
composer config -g repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/
这条命令绕过所有 fallback 判断逻辑,在 Composer 2.2–2.5 各小版本中行为一致。删配置还容易误删私有源字段(如 repositories 整个数组),导致后续 composer install 报错找不到私有包。











