composer全局镜像配置必须满足路径、键名、作用域三重条件才生效:键名须为repos.packagist.org.url(非repo.packagist),url需以/结尾,必须加--global参数,且需执行composer clear-cache验证真实请求。

全局配置不是“设了就生效”,而是必须满足路径、键名、作用域三重条件,漏掉任一环节都会静默失效。
composer config --global 命令漏掉 --global 就写进项目里
这是最常踩的坑:运行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/ 看似正确,实际只是把配置塞进了当前项目的 composer.json 的 config 字段——而这个字段对镜像源根本不起作用。项目级 config 只控制 vendor-dir、bin-dir 这类路径,不接管包源。
- 必须显式加
--global(或简写-g),否则等于白操作 - 值含空格或特殊字符时,务必用英文双引号包裹,例如:
composer config --global cache-dir "/data/composer-cache" - 嵌套结构(如私有仓库)不能一次设全,得拆成两步:
composer config --global repositories.myrepo.type "composer"和composer config --global repositories.myrepo.url "https://my-repo.example.com"
镜像源必须用 repos.packagist.org.url,不是 repo.packagist
Composer 2.x 已废弃 repo.packagist 写法。设成 repo.packagist 表面成功,实际不生效,composer install 仍走官方源。
- 正确键名是:
repos.packagist.org.url(注意复数repos、带.org、结尾是.url) - 值必须是完整 HTTPS 地址,且末尾带斜杠:
https://mirrors.aliyun.com/composer/—— 少斜杠在 Composer 2.2+ 会直接 404 - 设完必须执行
composer clear-cache,否则旧缓存里的索引还在,新镜像压根没机会用上
哪些配置真能跨项目生效,哪些只是幻觉
Composer 对不同配置项的处理逻辑完全不同,不是所有 config 键都支持“全局”语义。
- 真正稳定全局生效(项目无法覆盖):
github-oauth、http-proxy、cache-dir、process-timeout、secure-http - 只在空目录下兜底生效(一旦项目有
composer.json就被忽略):minimum-stability、prefer-stable、platform - 完全无效(设了也静默丢弃):
autoload、require、scripts—— 它们根本不属于全局配置范畴
验证是否真的生效,别信自己“以为”的路径
Composer 不会读你“以为”的那个 config.json。它优先检查 $COMPOSER_HOME 环境变量,其次才是默认位置。Linux/macOS 新版默认读 ~/.config/composer/config.json,Windows 是 %APPDATA%\Composer\config.json,但多个路径共存时只认一个。
- 查真实路径:运行
composer config --global --list --verbose,首行就是实际加载的文件路径 - 查是否被覆盖:进任意项目目录后运行
composer config --list(不加--global),对比同名 key 的值;若项目级存在,它一定优先 - 查网络行为:执行
composer clear-cache && composer require monolog/monolog --no-install -vvv,在输出里搜索Downloading,确认 URL 是你的镜像地址而非packagist.org
最麻烦的不是不会设,而是设错却不报错——JSON 格式错、路径不存在、键名拼错一个字符,Composer 都会静默跳过,后续命令只在奇怪的地方卡住或失败。每次怀疑配置失效,先跑一遍 --verbose 和 -vvv,比翻文档快得多。











