全局配置 composer config -g repo.packagist 经常不生效,因项目级 composer.json 中的 repositories 字段会完全屏蔽全局配置;唯一可靠方式是将镜像源按规范写入项目 composer.json 的 repositories 对象中,并执行 composer update --lock。

全局配置 composer config -g repo.packagist 为什么经常不生效
它只写入 ~/.composer/config.json,但只要项目目录下存在 composer.json 并定义了 repositories 字段,Composer 就完全忽略全局配置——不是优先级低,是压根不读。常见失效场景包括:
- CI 构建容器没初始化
~/.composer目录,composer config -g命令静默失败,配置根本没写进去 - 宝塔面板用
www用户执行命令,却在root用户家目录配了镜像,两者~/.composer/config.json完全隔离 - 项目里已有
"packagist.org": false,哪怕全局配了镜像,也会被这条规则屏蔽
项目级配置才是唯一可靠的方式
把镜像源明确写进项目 composer.json 的 repositories 字段,才能确保所有人、所有环境行为一致。注意几个硬性结构要求:
-
repositories必须是对象({}),不是数组([]);如果已是数组,composer config repo.packagist会直接报错 - 键名必须是
"packagist"(单数),且值里必须包含"type": "composer"和以/结尾的 HTTPS URL,例如:"https://mirrors.aliyun.com/composer/" - 改完后必须运行
composer update --lock,否则composer.lock还指向旧源,安装时仍走官方地址
“全局装工具、项目装依赖”和镜像配置无关
有人误以为“全局镜像 = 全局命令走镜像,项目依赖走另一套”,但 Composer 没这机制。无论是 composer global require 还是项目内 composer require,都受当前生效的镜像配置控制——而这个“当前生效”只取决于命令执行时所在目录是否含 composer.json 及其 repositories 内容。
-
COMPOSER_REPO_PACKAGIST=https://mirrors.tencent.com/composer/ composer install是临时切换的唯一干净方式 - 所谓“分流”只能靠脚本封装或目录隔离,不能指望 Composer 自动识别命令类型
- 镜像只管元数据(
packages.json、p2/xxx.json)下载路径,zip/tar 包的实际地址由composer.lock或包自身定义,镜像不代理也不改写
验证镜像是否真生效,别信 composer config 输出
运行 composer config -g repo.packagist 有输出,不代表全局镜像正在用;运行 composer config repo.packagist 返回值非空,也不代表项目实际走这个源。真正有效的验证方式只有两种:
- 加
-vvv参数运行composer install,看日志里请求的是哪个域名(比如GET https://mirrors.aliyun.com/composer/p2/...) - 临时删掉项目
composer.json里的repositories,再跑一次composer install -vvv,对比请求路径变化
最常被忽略的点:改了 composer.json 后忘了 composer update --lock,或者误把 repositories 写成数组导致整个字段被忽略——这种结构错误不会报错,只会静默失效。











