GitHub Actions 中 composer install 慢的根本原因是未走国内镜像源,必须显式使用 --repository-url=https://mirrors.aliyun.com/composer/ 参数(末尾斜杠不可省),缓存 ~/.composer/cache(key 需含 PHP 版本和 composer.lock 哈希),并确保 composer.lock 记录新源地址。

GitHub Actions 里 composer install 还是慢?根本没走国内镜像源——必须显式传 --repository-url,缓存 ~/.composer/cache,且 composer.lock 必须记录新源地址。
为什么 composer config -g 在 CI 中几乎无效
每次 GitHub Actions runner 都是全新容器,~/.composer/config.json 是空的或权限受限;即使你写了 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,后续 composer install 仍可能静默 fallback 到 packagist.org。
-
composer diagnose不验证实际请求地址,只检查配置语法,别信它的 OK 输出 -
composer config -g repo.packagist返回空、null或纯字符串(如"https://packagist.org"),说明根本没写进当前用户配置 - runner 默认以非 root 用户运行,
sudo composer config -g写进的是/root/.composer/config.json,当前用户读不到 - 真正可靠的方案不是依赖全局配置,而是把镜像地址直接塞进命令行
--repository-url 参数必须严格写对
这是唯一能在 CI 中 100% 确保走镜像的方式,但参数格式极易出错:
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
- 正确写法:
composer install --repository-url=https://mirrors.aliyun.com/composer/ --no-interaction --prefer-dist --optimize-autoloader -
--repository-url是完整参数名,--repository或--repository-url=xxx(等号后无空格)才有效;--repository=https://是无效写法 - URL 末尾斜杠
/不能省:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(部分 Composer 2.2+ 版本会拼出/packages.json导致 404,然后静默降级) - 加
-vvv调试时,日志里看到GET https://mirrors.aliyun.com/composer/p2/monolog/monolog.json才算真正生效
缓存 ~/.composer/cache,而不是 vendor/
缓存 vendor/ 看似省事,实则埋雷:autoloader 文件硬编码绝对路径,CI 每次运行路径不同,上线后容易报 Class not found 或 failed to open stream。
- 应缓存
~/.composer/cache,它只存 zip/dist 包,与 PHP 版本、扩展开关完全解耦 - cache key 必须包含:
${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - 顺序不能乱:先设置
COMPOSER_HOME(可选),再actions/cache,最后composer install - 漏掉
--prefer-dist会触发git clone,而 CI 容器默认无 Git 凭据,报could not read Username
composer.lock 里还记着 github.com?删了重装
镜像源只管元数据和 zip 下载,不管 composer.lock 里已记录的包地址。如果 lock 文件里仍是 "dist": {"url": "https://api.github.com/..."},Composer 就会照单下载,无视任何镜像配置。
- 验证方法:
composer install -vvv | grep "Loading composer repositories",输出应含你指定的镜像域名 - 临时补救无效:改完镜像后,必须删掉
composer.lock和vendor/,再跑composer install(不是update) - 项目级配置更稳妥:在项目根目录执行
composer config repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/(不加-g),它会自动更新composer.json的repositories字段 - 改完建议立刻提交
composer.json,并确保composer.lock是新生成的——否则协作时别人拉代码仍走海外源
最易被忽略的一点:镜像只加速元数据加载和 ZIP 包下载,不解决 Resolving dependencies 卡顿。如果卡在这里,问题出在 composer.json 的 PHP 版本约束太宽、require-dev 塞太多工具链,或用了废弃插件——换任何镜像都无效。

















