必须严格满足三要素:-g参数、键名repo.packagist(单数)、url以/结尾的https地址,缺一即静默失效,导致composer install仍卡在downloading;resolving dependencies卡住则与镜像无关,多因composer.lock缺失、minimum-stability设为dev或私有仓库不可达所致。

composer config -g repo.packagist 命令必须写对三个关键点
全局换源不是“试试看”,漏掉任意一个要素就静默失效,composer install照旧卡在 Downloading。你看到的慢,90% 和宽带无关,是命令没生效。
必须同时满足:
-
-g不能省——缺了就只改当前目录的composer.json,换项目就失效 - key 必须是
repo.packagist(单数repo,不是repos;也不能写成packagist.org) - URL 必须带
https://且末尾有斜杠/,例如https://mirrors.aliyun.com/composer/(少斜杠会拼出/composerpackages.json导致 404)
正确执行:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
验证是否成功:composer config -g repo.packagist,输出应为类似 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。如果为空、报错或还是 https://packagist.org,说明没写对。
为什么换源后 still stuck at “Resolving dependencies”?
镜像源只加速下载,不解决依赖解析慢的问题。Resolving dependencies 卡住,基本和网络、镜像无关,而是本地环境或配置问题。
常见原因:
-
composer.lock缺失或未提交——Composer 被迫重算整个依赖图 -
"minimum-stability": "dev"在composer.json中开启,触发大量版本试探 - 项目引用了已下线或不可达的私有仓库,Composer 逐个超时重试(每个 30 秒)
- CLI 模式下 PHP 的 OPcache 被禁用,导致 Composer 自身反复编译
快速定位:composer diagnose 查看是否提示 Repo packagist.org is default;再运行 composer config --list --global | grep repositories 确认实际生效的是哪个源。
parallel-downloads=10 是提速刚需,但只对 composer install 有效
Composer 2.2+ 默认并发数是 3,等于没开并行。不调这个值,哪怕镜像再快,下载仍是瓶颈。
设置方式:
- 全局启用:
composer config -g parallel-downloads 10 - CI 脚本中显式带上:
composer install --prefer-dist --no-dev --no-autoloader --no-scripts
注意:
- 该参数只对
composer install生效;composer update因需重算依赖图,仍部分串行 - 并发过高可能触发临时文件竞争,报
file_put_contents(/tmp/): failed to open stream,此时降到6或8再试 -
--prefer-dist必须配合镜像才有效——国内镜像几乎不缓存 source,没切成功就会 fallback 到慢速 Git 克隆
CI 构建中必须关掉 autoload 和脚本,否则白提速
开发机需要自动加载和钩子脚本,但 CI 场景下它们全是冗余开销。vendor 目录装完也跑不起来,因为根本没生成 autoload.php。
推荐组合参数:
-
--no-autoloader:跳过生成vendor/autoload.php,后续用composer dump-autoload --optimize单独补 -
--no-scripts:阻止执行post-install-cmd,避免意外触发npm install或php artisan optimize -
--prefer-dist:强制走 ZIP 包而非 Git 克隆,解压轻量、速度快
注意:--classmap-authoritative 只应在 CI 中启用,开发时开了会导致新增类不被识别。真正卡点往往不在下载本身,而在 lock 文件校验、autoloader 重建、以及没关掉的 post-update-cmd 脚本。











