CI中composer config -g总不生效,因CI环境(如GitHub Actions、宝塔)以runner/www等非本地用户运行,读取各自家目录下的配置;且常见静默失败点包括键名写成repos.packagist、漏掉type值composer、URL末尾缺/;项目级配置(composer config repo.packagist composer https://mirrors.aliyun.com/composer/)更可靠,可提交至Git并优先生效。

CI中composer config -g为什么总不生效
因为CI环境(GitHub Actions、GitLab Runner、宝塔)几乎从不用你本地的用户身份运行命令。你在本地用root执行了composer config -g,但runner是runner用户,读的是/home/runner/.composer/config.json;宝塔默认以www用户执行,sudo composer config -g写进的是root配置,完全无效。
常见静默失败点:
-
repos.packagist(多一个s):Composer 2.9.6直接忽略,不报错也不写入 - 漏掉
composer这个type值,例如composer config -g repo.packagist https://mirrors.aliyun.com/composer/:跳过配置,fallback到官方源 - URL少末尾
/,比如https://mirrors.aliyun.com/composer:拼出/composerpackages.json,返回404或静默回退
项目级配置才是CI真正可靠的方案
全局配置在CI里基本不可靠,项目级配置能提交到Git,所有环境行为一致,且优先级高于全局设置。进项目根目录后执行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
这条命令会自动处理三种情况:
- 如果
composer.json原有"repositories": {}(空对象),它会安全追加packagist条目 - 如果已是
"repositories": [](数组),它会向末尾插入新项,不破坏已有私有源 - 如果根本没
repositories字段,它会新建并确保key是"packagist"(不能自定义为"aliyun")
⚠️别手动编辑JSON:少一个逗号、引号不闭合、或多一个空格,都会触发JSON decode error,CI直接失败。
换镜像后必须清理的三样东西
镜像只影响元数据和ZIP包下载路径,不解决缓存污染或lock文件哈希不匹配问题。以下三步缺一不可:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer clear-cache:旧缓存里存的是官方源URL和hash,不清掉,composer update仍可能校验失败 - 删掉
vendor/目录:避免残留旧autoload映射或平台特定二进制文件 - 删掉
composer.lock:老lock文件记录的是packagist.org的dist URL和hash,换镜像后不重生成,下载时仍走官方链接,DNS或证书可能已失效
之后再跑composer install(不是update),否则旧lock仍指向海外源。
验证是否真走镜像的唯一方式
别信命令执行成功,也别信composer diagnose——它只检查配置是否存在,不验证实际请求路径。唯一可靠验证方式是加-vvv参数:
composer install --no-cache -vvv
观察日志中是否出现类似这样的行:
GET https://mirrors.aliyun.com/composer/p2/symfony/console.json
只要看到mirrors.aliyun.com或tuna.tsinghua.edu.cn,才算真生效。如果日志里还有GET https://packagist.org/,说明镜像没起作用,得回头查repo.packagist拼写、/结尾、type值是否漏写。
复杂点在于:老项目composer.lock里content-hash是32位md5(如"a1b2c3d4e5f678901234567890123456"),这类项目禁用packagist.org兜底后,一旦镜像未同步其依赖的旧版本(比如symfony/console v3.4),就会报Could not find package——此时必须用composer config repositories.packagist.org false显式关闭兜底,而不是指望镜像“自动兼容”。

















