全局配置写在用户目录下的 config.json 文件中:linux/macos 为 ~/.composer/config.json,windows 为 %appdata%\composer\config.json;它仅影响当前用户,不被 composer install 默认读取,且优先级低于项目级配置。

全局配置写在哪?composer config --global 实际改的是哪个文件
它修改的是当前用户的 Composer 全局配置文件,路径通常是 ~/.composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows)。这个文件只影响当前系统用户,不随项目走,也不被 composer install 读取——除非你显式用 --global 参数调用。
常见错误现象:执行 composer config --global repo.packagist composer https://packagist.phpcomposer.com 后,新项目依然走官方源。这是因为项目级配置(composer.json 中的 repositories)优先级更高,全局配置仅在项目没覆盖时兜底。
- 全局配置不会自动同步到已有项目,每个项目仍以自己
composer.json为准 - 若想让所有新项目默认用私有源,得配合
composer create-project模板或团队统一脚手架 - Windows 用户注意:PowerShell 里
%APPDATA%需展开为完整路径,否则命令可能静默失败
哪些配置项真正适合设成全局?
只有那些和「环境」强相关、且不随项目变化的设置才适合全局。比如镜像源、认证凭据、缓存路径;而 minimum-stability、prefer-stable 这类语义化配置,必须由项目自己决定。
典型可用项:
-
repo.packagist:换国内镜像源(如腾讯、阿里云),避免每次 init 都手动改 -
github-oauth:存 GitHub Token,解决频繁限流(composer config --global github-oauth.github.com xxx) -
cache-dir:指向 SSD 路径提升安装速度,尤其 CI 环境 -
secure-http:设为false仅当内网私有源全走 HTTP,但不推荐
别碰的项:autoload、scripts、require —— 它们属于项目契约,全局设了也无效。
composer config --global 和项目级 config 的冲突怎么处理
全局配置是 fallback,项目级永远胜出。但有个例外:认证类配置(如 http-basic、github-oauth)是合并行为,不是覆盖。也就是说,你可以全局配一个私有 GitLab 的账号,再在某个项目里额外加一个 Nexus 的账号,Composer 会一起用。
验证方式很简单:
- 运行
composer config --global --list查看全局生效项 - 进项目后跑
composer config --list(不带--global),对比输出差异 - 如果某项在两者中都出现,且值不同,项目级值生效
容易踩的坑:用 composer config --global discard-changes true 以为能跳过 git dirty 检查——其实这是废操作,该配置只对 composer update 在本地仓库有效,且必须放在项目级 composer.json 的 config 下才起作用。
CI/CD 里用全局配置要注意什么
CI 环境(比如 GitHub Actions、GitLab CI)通常用临时容器,--global 写的配置在 job 结束后就丢了。所以不能依赖“先 config 再 install”的顺序来持久化设置。
- GitHub Actions 推荐用
composer config http-basic.xxx配合secrets,每步都重设(因为 cache 不跨 job) - GitLab CI 若启用了
cache: key: $CI_COMMIT_REF_SLUG,可把~/.composer整个目录缓存,但要注意权限问题(chown -R $USER:$USER ~/.composer) - 安全红线:绝不在全局配置里硬编码敏感 token,要用环境变量注入,例如
composer config --global github-oauth.github.com "${GITHUB_TOKEN}"
最常被忽略的一点:Docker 构建时若用 composer install --no-interaction,它不会读全局配置里的 github-oauth,必须确保 auth.json 存在或通过 --auth 显式传入。










