composer config -g repo.packagist 是确认全局 Packagist 镜像地址最准、最轻量的方式,直接读取 ~/.composer/config.json,不依赖网络、缓存或项目上下文;必须带 -g 参数,否则查的是当前项目配置;输出含阿里云等镜像 URL 即生效,若为 packagist.org 则未切换;composer diagnose 显示“Repo.packagist.org is not configured”是正常现象,表明镜像已接管。

composer config -g repo.packagist
这条命令直接输出当前全局配置的 Packagist 镜像地址,是最准、最轻量的确认方式。它不查缓存、不走网络、不依赖 composer.json 项目上下文,只读取 Composer 自己的全局配置文件(通常是 ~/.composer/config.json)。
常见错误现象:composer config -g repos.packagist(多写了个 s)会返回空或报错;composer config repo.packagist(漏了 -g)查的是当前项目配置,容易误判。
- 必须加
-g参数,否则查的是当前目录下的composer.json里局部配置 - 如果输出是
{"type": "composer", "url": "https://packagist.org"},说明没切镜像 - 如果输出含
"url": "https://mirrors.aliyun.com/composer/"或类似地址,就是已生效的镜像源
composer diagnose 显示“Repo.packagist.org is not configured”
这不是警告,而是提示你当前没显式配置 Packagist 官方源——这恰恰说明镜像已接管。Composer 默认内置官方源,一旦你用 composer config -g repo.packagist 覆盖了它,diagnose 就会如实反馈“没配官方源”,而不是“配错了”。
使用场景:CI/CD 环境里看到这行输出,别急着修复,先跑 composer config -g repo.packagist 确认实际值。
-
diagnose的这句输出和是否能正常install无关 - 只要
config -g repo.packagist返回有效 URL,且能composer show列出包,就说明镜像工作正常 - 某些旧版 Composer(
为什么 composer config -l 里看不到 repo.packagist?
composer config -l 只列出“有值且非默认”的配置项。Packagist 镜像属于“显式覆盖默认源”的行为,但 Composer 内部把它当作一个特殊键处理,不进 -l 的扁平列表,而存在 repo.packagist 这个嵌套结构里。
参数差异:-l 是 list,适合查通用配置如 github-protocols、process-timeout;查源必须用精确路径 repo.packagist。
- 执行
composer config -g(不带子键)会输出完整全局配置,能看到"repositories"或"repo"字段 - 如果配置是通过
composer config -g repos.packagist(注意repos复数)设的,那是老写法,新版已弃用,可能导致行为不一致 - 阿里云、腾讯云等镜像文档里给的命令如果含
repos.,建议手动改成repo.并加-g
切换镜像后 composer update 还走官网?
大概率是配置没生效到运行时:Composer 启动时读取配置有优先级——项目级 > 全局级 > 默认。如果当前目录下 composer.json 里有 repositories 字段,它会完全屏蔽全局镜像设置。
性能影响:项目级配置每次 update 都会触发额外解析,还可能因格式错误导致超时;全局镜像则稳定复用,DNS 和连接池更友好。
- 检查当前目录是否存在
composer.json,并搜索"repositories"或"packagist.org" - 临时验证:删掉项目
composer.json里的repositories段,再跑composer config -g repo.packagist+composer update -n - Windows 用户注意:
%COMPOSER_HOME%环境变量可能指向非预期路径,导致-g实际写入了别的配置文件
镜像配置真正的复杂点不在命令本身,而在配置作用域的叠加和隐藏覆盖——repo.packagist 这个键名不直观,全局和项目配置又无声竞争,稍不注意就以为切成功了,其实请求早被本地 composer.json 劫持了。