composer全局配置存于~/.composer/config.json(linux/macos)或%appdata%\composer\config.json(windows),须用composer config --global命令操作,直接编辑易出错且不触发验证。

全局配置存在哪?直接改 composer.json 不生效
Composer 的全局配置不存放在项目根目录的 composer.json 里,也不在你当前用户的家目录下手动建的某个 JSON 文件中。它实际由 composer config 命令写入到一个固定位置:~/.composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows)。直接编辑这个文件虽可行,但容易格式出错、权限异常,且无法触发 Composer 内部的验证逻辑。
正确做法永远是走命令行:
- 查看当前全局配置:
composer config --global --list - 设置全局镜像源:
composer config --global repo.packagist composer https://mirrors.aliyun.com/composer/ - 关闭 HTTPS 验证(仅限内网调试):
composer config --global secure-http false
composer config --global 和 composer config 混用会覆盖项目配置
不加 --global 参数时,composer config 默认操作的是当前目录下的 composer.json(即项目级配置)。如果在项目里误用了 --global,比如想设项目私有仓库却写了 composer config --global repositories.myprivaterepo ...,结果就是把私有源写进了全局配置,所有项目都去连它——轻则报 401,重则泄露内网地址。
更隐蔽的问题是:项目级配置中的 config 字段和全局配置会合并,但同名键以项目为准;而 repositories 这类数组型配置默认是「替换」而非「合并」,除非显式启用 composer config --global repositories --merge(5.0+ 支持),否则后设的会直接丢掉前面的。
设置国内镜像时,repo.packagist 和 repositories.packagist.org 别搞混
Composer 2.x 开始弃用了 repo.packagist,改用 repositories.packagist.org。如果你用老教程抄了 composer config --global repo.packagist composer https://xxx,在新版里根本不会生效,composer install 依然走官方源。
正确写法分版本:
- Composer 2.0+:
composer config --global repositories.packagist.org composer https://mirrors.aliyun.com/composer/ - Composer 1.x:
composer config --global repo.packagist composer https://mirrors.aliyun.com/composer/
判断当前版本:composer --version。不确定时,先运行 composer config --global --list | grep -i repo 看输出里出现的是哪个 key。
全局 auth.json 权限问题导致私库认证失败
用 composer config --global http-basic.example.com username password 存私库凭据,本质是往 ~/.composer/auth.json 写内容。但很多 Linux/macOS 用户遇到 Could not authenticate against example.com,其实不是密码错,而是 auth.json 权限太宽(比如 644)——Composer 为安全强制要求该文件权限 ≤ 600。
检查并修复:
- 确认路径:
ls -l ~/.composer/auth.json - 收紧权限:
chmod 600 ~/.composer/auth.json - Windows 用户不用管权限,但要注意
auth.json必须是 UTF-8 无 BOM 编码,否则中文密码会解析失败
全局配置里最麻烦的从来不是语法,而是路径、权限、版本差异这三样东西叠在一起——改完记得 composer clear-cache,不然旧缓存可能还在用老配置。










