答案是三要素缺一不可:键名必须为repo.packagist(单数)、type值必须显式写composer、url须https且以/结尾;任一缺失均静默回退官方源且不报错。

直接执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 就能生效,但漏掉任意一个细节都会静默失败——不是慢,是根本没走镜像。
为什么命令跑完还是连 packagist.org
这不是网络问题,是配置根本没写进去。Composer 对键名、type 值、URL 格式三者做硬校验,错一个就 fallback 到官方源,且不报错、不提示。
-
repo.packagist必须是单数(不是repos.packagist或packagist.org) - 中间的
composer是 type 值,不能省略,也不能写成https或其他字符串 - URL 必须是 HTTPS,且末尾必须带斜杠:
https://mirrors.aliyun.com/composer/✅,少斜杠会请求/composerpackages.json导致 404 - 必须加
-g,否则只改当前目录下的composer.json,换个项目就失效
怎么确认镜像真的生效了
别信“执行完就 OK”,一定要验证输出。最可靠的方式是直接查全局配置值:
- 运行
composer config -g repo.packagist,输出必须是完整 JSON,例如{"type":"composer","url":"https://mirrors.aliyun.com/composer/"} - 如果返回空、
null、Key "repo.packagist" does not exist,说明没写成功 - 补救:检查是否用了
sudo执行(导致写进 root 配置),或COMPOSER_HOME环境变量指向了错误路径 - 辅助验证:加
-vvv运行composer install -vvv 2>&1 | grep "Downloading",日志里出现的域名必须是mirrors.aliyun.com
项目级配置更适合团队和 CI 场景
你在终端配好了全局镜像,但宝塔后台、GitHub Actions、Docker 容器里照样连不上——因为它们用的是不同用户的 ~/.composer/config.json。
- 进项目根目录(含
composer.json),运行:composer config repo.packagist composer https://mirrors.aliyun.com/composer/(去掉-g) - 它会自动向
composer.json的repositories字段写入"packagist": {"type": "composer", "url": "..."} - 如果
repositories已是数组格式([]),命令会报错;需先手动改成对象{} - 改完必须删掉
vendor/和composer.lock,再运行composer install——update会复用旧 lock 文件,可能仍指向海外源
换源后还卡在 Resolving dependencies 怎么办
镜像只加速下载环节,完全不参与依赖解析。卡在这里和镜像无关,典型原因有:
-
composer.json里写了太宽泛的 PHP 版本约束,比如"php": "^7.4 || ^8.0 || ^8.1",导致 Composer 尝试大量组合 -
require-dev里塞了未锁定版本的工具(如"phpunit/phpunit": "^10.0") - 用了大量
dev-main或dev-develop分支依赖 - 本地
openssl扩展未启用(php -m | grep openssl检查),SSL 握手失败引发重试
这些情况换任何镜像都没用,得收紧约束、锁定版本、删掉非必要 dev 包。











