GitLab CI中Composer缓存需同时配置vendor/和$HOME/.composer/cache,缓存key须含项目ID、分支、任务名并用restore-keys前缀匹配,私有包认证用masked变量生成auth.json,仓库声明需vcs类型且HTTPS URL带.git后缀。
缓存 vendor 和 ~/.
composer
/cache 必须同时配置
只缓存
,下次
还得重新下载 ZIP 包;只缓存
,
每次重建,等于白缓存。GitLab CI 的 Composer 缓存生效的前提,是两个路径都进
。
下必须写两行:
和
在 GitLab 官方 Runner 镜像里默认存在,不用
,但私有 Runner 若以
运行,
是
,得确认该路径可写
别用
改路径——引入额外变量,CI 环境难复现、难调试
缓存 key 要反映依赖真实状态,restore-keys 是 fallback 不是兜底
缓存 key 写成固定字符串(比如
),会导致不同分支、不同 PHP 版本共用同一份缓存,轻则安装失败,重则 vendor 里混进不兼容的扩展。
推荐第一级 key:
—— 精确匹配同项目、同分支、同任务的上一次缓存
restore-keys 加一行:
—— feature 分支刚建时,能 fallback 到 main 分支缓存,冷启更快
restore-keys 只支持前缀匹配,末尾不能加通配符(如
无效)
不要把 PHP 版本硬编码进 key(如
),而应通过
变量注入,避免手动维护出错
私有包认证必须走 auth.json 文件,别碰全局 config
在 CI 里基本不可靠:容器每次新建,
会被覆盖或忽略;更糟的是,一旦触发交互式提示(比如没加
),job 直接卡死。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
在
里用
生成文件,值来自 GitLab UI 中新建的
masked 变量
变量值必须是合法 JSON 字符串,填的时候用单引号包裹:
执行
时显式指定:
加一行校验:
,JSON 错了立刻报错,不等 composer 静默失败
拉取私有 GitLab 仓库要显式声明 vcs + 正确协议 + 分支格式
直接在
里写
,但没配
,Composer 根本不知道去哪找——它不会自动猜你内部 GitLab 的地址,也不会自动加 Token。
必须放在
顶部,且类型为
;顺序很重要,私有源要排在
前面
HTTPS 方式 URL 必须带完整域名和
后缀:
,其中
是 GitLab 固定前缀
SSH 方式需提前注入密钥,并确保
里有目标 GitLab 主机记录;URL 必须是
格式
分支名必须带
前缀(如
),不能只写
;包名大小写必须和目标仓库
中的
完全一致
缓存、认证、仓库声明这三块,任意一块漏掉或写错,
就会变慢、失败或行为诡异。最常被忽略的是 restore-keys 的前缀匹配规则和 auth.json 的 JSON 引号处理——看着配置全了,其实根本没生效。
vendor/composer install~/.composer/cachevendor/cache.pathspathsvendor/$HOME/.composer/cache/$HOME/.composer/cachemkdir -proot$HOME/rootcomposer global config cache-dircomposer-cache${CI_PROJECT_ID}-composer-${CI_COMMIT_REF_SLUG}-${CI_JOB_NAME}${CI_PROJECT_ID}-composer-main--*php8.2-composerPHP_VERSIONcomposer config --auth --global~/.composer/auth.json--no-interaction.gitlab-ci.ymlecho "$COMPOSER_AUTH_JSON" > auth.json'{"http-basic":{"your.packagist.example.com":{"username":"token","password":"abc123"}}}'composer installcomposer install --auth-file=auth.json --no-interaction --prefer-distcat auth.json | php -r "json_decode(file_get_contents('php://stdin')) or die('invalid json');"require"mygroup/mypackage": "dev-main"repositoriesrepositoriescomposer.json"type": "vcs"packagist.org.git"https://oauth2:YOUR_TOKEN@gitlab.example.com/mygroup/mypackage.git"oauth2:known_hostsgit@gitlab.example.com:mygroup/mypackage.gitdev-dev-mainmaincomposer.json"name"composer install