composer从不读取composer_repo_packagist等环境变量,唯一有效方式是composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,且必须满足三条件:带-g、键名单数、url末尾带/。

Composer 从不读取 COMPOSER_REPO_PACKAGIST 这类环境变量,设了等于没设。 它只认 composer config 写进配置文件里的 repo.packagist 字段——其他任何方式,包括系统级环境变量、HTTP_PROXY、自定义变量名,全被忽略。
COMPOSER_REPO_PACKAGIST 变量根本不存在于 Composer 源码中
这个变量名是民间误传。Composer 2.0 至 2.8.x 的 RepositoryManager 类里,只识别 COMPOSER_HOME、COMPOSER_CACHE_DIR 等路径类变量,COMPOSER_REPO_PACKAGIST 不在白名单里,也不触发任何警告或日志。你设它,Composer 连看都不看一眼。
- 验证方法:执行
composer install -vvv,搜索日志里是否出现mirrors.aliyun.com;如果全是packagist.org,说明变量完全没参与解析 - 别信旧教程或 Shell 脚本里写的
export COMPOSER_REPO_PACKAGIST=...,实测 Windows / Linux / macOS 全平台静默失效 - 官方文档从未提过该变量,GitHub Issues 中也无对应 issue 或 PR 支持
真正起效的只有 composer config -g repo.packagist,但必须三条件同时满足
这条命令是唯一可靠路径,但错一个字符就静默失败——不是报错,而是写进去的内容无效,仍走官方源。
-
-g参数不能少,否则只写进当前项目,换目录即失效 - 键名必须是单数
repo.packagist,写成repos.packagist或repositories.packagist全部被跳过 - 第二个参数必须是
composer(type 值),漏掉会导致写入纯字符串而非 JSON 对象,composer config -g repo.packagist输出会是"https://..."而非{"type":"composer","url":"..."} - URL 必须以
https://开头且末尾带/,例如https://mirrors.aliyun.com/composer/;少斜杠会请求/composerpackages.json(404),然后安静 fallback 回 packagist.org
项目级 repositories 字段会彻底屏蔽全局镜像
只要项目根目录的 composer.json 里有 "repositories" 键,无论值是 []、{} 还是 {"packagist.org": false},全局配置就直接作废——不是优先级低,是根本不加载。
- 快速检查:
composer config repositories,输出里若不含https://mirrors.aliyun.com/composer/,就是被覆盖了 - 定位硬编码:
grep -A5 '"repositories"' composer.json - 临时禁用:
composer config --unset repositories(注意无-g) - 如需保留自定义源,把镜像写进项目配置:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
最常被忽略的是 URL 缺末尾斜杠和项目级 repositories 字段的存在——它们不会报错,也不会提示,只是悄悄让所有配置失效。验证时别只看 composer config -g 输出,一定要跑 composer install -vvv | grep Downloading 看真实请求地址。











