直接换源+挂缓存卷+更新lock文件三者对齐,才能将create-project从5分钟压至30秒内;仅改url或清缓存无效,因composer不报错却静默回退至packagist.org。

直接换源 + 挂缓存卷,create-project 从 5 分钟压到 30 秒内是常态;但只改镜像 URL 或只清缓存,基本没用——必须三者对齐:全局配置、缓存路径、lock 文件里的 dist URL。
composer config -g repo.packagist 命令写错了就等于没配
90% 的“换源不生效”都卡在这条命令上,Composer 不报错,但 silently fallback 到 packagist.org。关键点只有三个:
-
repo.packagist不能拼成repos.packagist(多一个 s 就彻底失效) - 中间那个
composer是 type 字段值,必须显式写出:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 必须是 HTTPS + 末尾带斜杠:
https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(缺斜杠在 Composer 2.2+ 会报 Invalid repository type)
验证是否成功:composer config -g repo.packagist 输出应为完整 JSON 对象,比如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},不是空、不是 https://packagist.org。
容器 CI 里 create-project 卡在 “Installing dependencies”?不是网慢,是没挂缓存卷
create-project 本质是先下载模板包,再执行一次完整的 composer install。它不读宿主机的 ~/.composer/config.json,也不复用宿主机缓存——容器里必须显式配置镜像源,且缓存路径要和挂载点一致。
- 缓存主体是
~/.composer-cache/files/,只挂vendor/或只挂composer.json没用 - 挂载写法示例(Linux/macOS):
docker run --user $(id -u):$(id -g) -v ~/.composer-cache:/tmp/cache -e COMPOSER_CACHE_DIR=/tmp/cache ... - 必须同步执行三步初始化(CI 脚本开头):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/→composer config -g cache-files-dir ~/.composer-cache/files→composer clear-cache
漏掉任意一步,create-project 就会反复下载 ZIP 包、重解压、重生成 autoload,时间全耗在 I/O 上。
为什么换了镜像,install 还是走 packagist.org?检查项目级 repositories 覆盖
只要项目根目录的 composer.json 里写了 repositories 字段,全局配置就完全失效。哪怕只有一行:"packagist": false 或 "url": "https://packagist.org",都会让 create-project 和后续 install 绕过镜像。
- 进项目目录执行:
grep -A 5 "repositories" composer.json,看是否含官方源地址 - 验证当前实际生效源:
composer config -l | grep repositories.packagist,输出为空或仍是https://packagist.org就说明被覆盖了 - 临时修复:
composer update --lock前先删掉composer.json里的repositories段;想保留私有源?手动把镜像加进项目级repositories数组里,而不是关掉packagist
create-project 不支持 --repository 参数,所以不能靠临时参数绕过——必须确保全局或项目级配置真正生效。
dist URL 不匹配会导致校验失败,哪怕镜像已生效
镜像源只加速元数据和 ZIP 包下载,但 composer.lock 里记录的 dist.url 如果还是 https://repo.packagist.org,Composer 会在下载后校验 hash,发现 URL 不匹配就 fallback 重试,日志里反复出现 GET https://repo.packagist.org/...。
- 换源后首次运行
create-project,建议加--no-cache或删掉旧composer.lock - 已有项目换源后,必须执行
composer update --lock,让 lock 文件里所有dist.url更新为镜像地址 - 验证方式:
composer show packagist/support -vvv日志中应出现GET https://mirrors.aliyun.com/composer/...,而非repo.packagist.org
最易忽略的点:镜像配置、缓存挂载、lock 文件三者必须严格对齐,差一个,create-project 就退回裸奔状态。











