答案是composer config -g repo.packagist在ci中常失效,因ci容器临时性导致~/.composer/config.json无法持久化,且项目级composer.json中"packagist.org"配置会覆盖全局设置;推荐优先使用composer_repo_packagist环境变量(需composer≥2.2)并配合clear-cache确保生效。

直接改 composer.json 不可靠,CI 环境里必须通过环境变量或全局配置生效。
为什么 composer config -g repo.packagist 在 CI 中常失效
很多 CI(如 GitHub Actions、GitLab CI)使用临时容器,composer config -g 写入的是当前用户家目录下的 ~/.composer/config.json,但某些镜像(如 php:8.3-cli)默认不挂载持久化 home,或以 root 用户运行导致配置未被读取。更关键的是,Composer 优先级中「项目级 composer.json」会覆盖全局配置,而多数项目没删掉自带的 "packagist.org" 配置块。
实操建议:
- 不要依赖
composer config -g单次命令,除非你确认 CI runner 的 home 持久且用户上下文一致 - 始终用
COMPOSER_REPO_PACKAGIST环境变量覆盖——这是 Composer 5.0+ 官方支持的最高优先级方式 - 若用旧版 Composer(composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/ 并确保执行用户与后续
composer install为同一用户
GitHub Actions 中推荐的三行写法
在 .github/workflows/ci.yml 的 steps 中插入:
- name: Set Composer mirror run: echo "COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/" >> $GITHUB_ENV
name: Install dependencies run: composer install --no-interaction --prefer-dist
-
name: Verify mirror is used run: composer config repo.packagist
说明:
Discussion Composer下载围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
$GITHUB_ENV是 Actions 特有机制,确保后续所有 step 都能继承该变量 - 不用
export或env:块,避免 shell 作用域丢失 -
composer config repo.packagist输出应为{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},不是packagist.org
-
GitLab CI 与自建 Runner 的兼容写法
GitLab CI 默认不提供 $GITLAB_ENV 类似机制,需显式注入到每个 job 的 variables 或用 before_script 设置:
before_script: - export COMPOSER_REPO_PACKAGIST=https://mirrors.huaweicloud.com/composer/ - composer clear-cache
注意点:
- 华为云镜像(
mirrors.huaweicloud.com)和阿里云(mirrors.aliyun.com)均稳定,但华为云对某些私有包兼容性略好 - 必须加
composer clear-cache,否则旧缓存仍可能回源到 packagist.org - 若 Runner 使用 Docker executor 且复用镜像,确认基础镜像中未预装旧版 Composer(如 1.x),它不识别
COMPOSER_REPO_PACKAGIST
验证是否真走国内镜像的两个硬指标
光看 composer install 不报错没用,得确认网络行为:
- 执行
composer install -v,日志中每条Downloading https://...的域名必须是镜像站(如mirrors.aliyun.com),而非packagist.org或api.github.com - 在 CI 日志里搜
Resolving dependencies through SAT前,应出现类似Reading composer.json of vendor/package (dev-main)—— 这表示已从镜像元数据拉取,而非实时爬 GitHub
最容易被忽略的是:某些私有包或 path 类型仓库不受镜像影响,它们的源地址写死在 composer.json 里,镜像设置对其完全无效。










