答案是必须显式使用--repository-url参数并确保URL末尾带斜杠,缓存~/.composer/cache而非vendor/,且install命令须包含--no-dev--prefer-dist--optimize-autoloader--no-interaction;否则镜像不生效、缓存失效或安装失败。

GitHub Actions里composer install还是慢?根本没走镜像源
90% 的 CI 构建卡在 Downloading xxx.zip,不是网络差,而是命令压根没走国内镜像——每次 Actions runner 都是全新容器,composer config -g 写的配置根本没机会生效,~/.composer/config.json 要么为空、要么权限不对、要么被忽略。
别信 composer diagnose 说的 “Repo packagist.org is default”,它只读配置文件,不验证实际请求地址。真正有效的方式只有一种:把镜像地址显式塞进命令行。
-
composer install --repository-url=https://mirrors.aliyun.com/composer/✅(URL末尾必须带/) -
--repository-url=和--repository-url(等号后空格)都有效;--repository=https://❌(参数名错) - 加
-vvv看日志:出现GET https://mirrors.aliyun.com/composer/p2/monolog/monolog.json才算真走镜像 - 如果日志里反复出现
GET https://packagist.org/或Downloading https://api.github.com/,说明镜像完全没起作用
缓存 ~/.composer/cache,别碰 vendor/
缓存 vendor/ 是危险操作:autoloader 文件硬编码绝对路径,CI 每次运行路径不同,上线后大概率报 Class not found 或 failed to open stream。真正该缓存的是 Composer 自身下载的 zip/dist 包,它们与环境完全解耦,只跟 composer.lock 哈希绑定。
- GitHub Actions 缓存路径必须写
path: ~/.composer/cache,不能写vendor/或~/.composer/vendor - cache key 必须包含 PHP 版本和
composer.lock哈希:${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - 顺序不能乱:先
actions/checkout@v4,再actions/cache,最后composer install - 缓存失效最常见原因:本地改了
composer.lock但没提交,导致 key 不匹配
composer.lock 里还记着 github.com?删了重装
镜像源只管元数据(包名、版本、依赖关系),不管 zip 包下载地址。composer.lock 一旦生成,就固化了每个包的 dist.url。如果它里面记的是 https://api.github.com/,Composer 就会照单下载,无视任何镜像配置。
- 验证方法:
composer install -vvv | grep "Loading composer repositories",输出应含你指定的镜像域名,而非packagist.org - 临时补救无效:改完镜像后,必须删掉
composer.lock和vendor/,再跑composer install(不是update) - 项目级配置更稳妥:在
composer.json里执行composer config repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/,它会自动往repositories字段安全追加 - 千万别手写
"packagist": false——这会彻底关掉基础包源,镜像临时不可用时,composer install直接失败
CI 中必须带的 install 参数一个都不能少
光走镜像、光缓存还不够。CI 环境下,composer install 必须带一组参数才能稳定、快速、可复现。
-
--no-dev:跳过require-dev里的测试/构建工具(如 phpunit、phpstan),加快安装;若需运行静态分析,单独开步骤 -
--prefer-dist:强制走 ZIP 包下载,避免触发git clone(CI 容器默认无 Git 凭据,会报could not read Username) -
--optimize-autoloader:生成静态类映射,减少后续 autoload 阶段文件扫描,单元测试启动更快 -
--no-interaction:避免交互式提示阻塞自动化流程 - 漏掉任一参数,都可能导致超时、失败或产物不可用
复杂点在于:这些参数不是“可选优化”,而是 CI 场景下的事实必需项。容易被忽略的是 --prefer-dist —— 它不光提速,更是绕过 Git 认证问题的关键开关。


















