composer config -g repo.packagist 命令必须严格满足三要素才生效:键名 repo.packagist(单数)、type 值 composer、URL 为 HTTPS 且末尾带 /;缺一则静默回退官方源,验证需执行该命令并输出完整 JSON。

composer config -g repo.packagist 命令必须带齐三个参数
这条命令不是“大概写对就行”,而是三要素缺一不可:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/。漏掉任意一个,配置就静默失效——不报错、不提示,composer install照旧卡在 Downloading 或超时。
-
-g:表示写入全局配置(~/.composer/config.json或 Windows 下%APPDATA%\Composer\config.json),漏掉就只改当前目录的composer.json,换项目就失效 -
repo.packagist:键名必须是单数、全小写、不能多s(repos.packagist是无效字段) -
composer:这是type值,不是注释,也不是可选项;省略后 Composer 2.0+ 会 fallback 到默认源 - URL 必须以
https://开头,且末尾带/(https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌)
验证是否真正生效,别信“执行完就完了”
执行完命令后,立刻运行 composer config -g repo.packagist。正确输出应为类似:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。如果返回空、null 或报错 Command "config" is not defined,说明要么命令写错,要么 Composer 版本太低(需先 composer self-update)。
- 再进一步验证:运行
composer show -p | head -3,第一行应显示来自mirrors.aliyun.com的包列表 - 若
composer diagnose中 “Repo:” 行仍显示packagist.org,说明项目级repositories字段覆盖了全局配置 - CI 环境(如 GitHub Actions)默认不读全局配置,需额外加环境变量:
COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/ composer install
项目级 repositories 字段会彻底屏蔽全局镜像
只要项目根目录的 composer.json 里存在 "repositories" 字段(哪怕只是空数组 [] 或空对象 {}),全局配置就完全失效。这是最常被忽略的“无声覆盖”。
- 临时排查:进项目目录,运行
composer config --unset repositories,它会删除整个字段,而非清空内容 - 不要手动编辑
composer.json加repositories—— 容易写错格式、污染 Git、引发团队协作问题 - 某些 Laravel 脚手架或私有模板自带
"repositories": [],新建项目后第一件事就是检查这个 - 若确需项目级定制(如加私有包源),用
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(去掉-g)让 Composer 安全合并,而不是硬编码
为什么不能只靠 composer create-project -r 临时指定
composer create-project laravel/laravel myapp -r https://mirrors.aliyun.com/composer/ 这类命令只影响当次执行,不解决日常 composer install 或 composer update 仍走慢源的问题。尤其 CI 流水线反复跑 install,没设全局源等于白配。
-
-r参数只对create-project和require生效,install和update不认它 - 部分框架 starter 模板还包含 Git 克隆步骤,镜像只加速包下载,Git 部分需另配代理或使用国内 fork
- 新包发布后可能有 1–2 小时同步延迟,若遇到 404,先
composer clear-cache,再临时切回官方源验证是否镜像滞后
repositories、CI 环境变量、create-project 的绕过机制、甚至 URL 少了个 /,都可能让请求悄悄回到 packagist.org。验证必须落到具体命令输出和日志里,不能只看配置文件有没有写进去。


















