因为 composer 2.x+ 不再读取 composer_repo_packagist,只认 composer_repo_packagist_com(必须带后缀 _com),且 url 需以 https:// 开头、末尾不能有斜杠;该变量优先级高于项目和全局配置,但若项目中已定义 repositories 则会被完全覆盖。

为什么直接设 COMPOSER_REPO_PACKAGIST 不生效
很多人试过在 shell 里执行 export COMPOSER_REPO_PACKAGIST=https://packagist.phpcomposer.com,然后跑 composer install,结果发现还是走官方源——因为 Composer 从 2.0 开始**不再读取这个环境变量**。它只认 COMPOSER_REPO_PACKAGIST_COM(注意后缀 _COM),而且必须是完整 URL,协议、域名、路径都不能少。
-
COMPOSER_REPO_PACKAGIST_COM是唯一被 Composer 2.x+ 官方支持的镜像环境变量 - 值必须以
https://开头,末尾不能带斜杠(https://mirrors.aliyun.com/composer✅,https://mirrors.aliyun.com/composer/❌) - 该变量只影响 packagist.org 的主源,不影响其他自定义仓库(如 private repo)
- 如果同时配置了
config.json中的repositories.packagist.org.url,环境变量优先级更高
全局生效:写进 shell 配置文件(推荐长期使用)
想让所有项目都走镜像,最稳妥的方式是把变量写进 ~/.bashrc 或 ~/.zshrc(取决于你用的 shell)。别只临时 export,否则新开终端就失效。
- 编辑配置文件:
echo 'export COMPOSER_REPO_PACKAGIST_COM=https://mirrors.aliyun.com/composer' >> ~/.zshrc - 重载配置:
source ~/.zshrc - 验证是否生效:
echo $COMPOSER_REPO_PACKAGIST_COM应输出对应 URL - 注意:Windows 用户需设系统级环境变量(非 PowerShell 临时 $env:xxx),且变量名全大写 + 下划线,和 Linux/macOS 一致
单项目临时覆盖:用 --no-plugins 避免插件干扰
有些项目装了 hirak/prestissimo 或其他加速插件,它们可能绕过环境变量改写请求逻辑,导致镜像不生效。这时候要强制禁用插件再试。
- 先确认是否插件干扰:
composer install --no-plugins -vvv 2>&1 | grep "Fetching"看实际请求地址 - 临时指定镜像并禁用插件:
COMPOSER_REPO_PACKAGIST_COM=https://packagist.phpcomposer.com composer install --no-plugins - 如果这时能走镜像,说明是插件冲突,建议升级插件或改用官方推荐的
composer config方式统一管理
和 composer config 冲突时谁赢?
环境变量和本地 composer.json 或全局 ~/.composer/config.json 都可能配置镜像。优先级是:**环境变量 > 项目级 config > 全局 config**。但有个坑:如果项目 config 里写了 "repositories": [{"type": "composer", "url": "..."}],那 packagist.org 就被完全替换掉了,环境变量就失效了。
- 检查项目是否覆盖了 packagist:
composer config repositories.packagist.org(返回 null 表示没动) - 若返回对象,说明项目主动屏蔽了默认源,此时环境变量无效,得删掉或改写该配置
- 清空项目级镜像配置:
composer config --unset repositories.packagist.org - 全局配置查看:
composer config -g repos.packagist.org.url
-vvv 看真实 HTTP 请求地址,比猜更可靠。











