composer config --list 显示的是运行时最终生效的合并配置,按项目→全局→环境变量→命令行优先级叠加,不包含默认值,且受插件和环境变量动态影响。

composer config --list 看到的到底是什么配置?
composer config --list 输出的是 Composer 运行时「最终合并生效」的配置,不是单纯读取某个文件。它的优先级是:项目 composer.json 中的 config 字段 → 全局 ~/.composer/config.json → 环境变量(如 COMPOSER_CACHE_DIR)→ 命令行参数。这意味着你看到的值,可能是被覆盖、被环境变量顶替、甚至被插件动态修改过的。
- 不加
-g时,--list默认只显示项目级显式设置的项 + 继承自全局的已设置项;它不会显示默认值(比如没设过process-timeout,就不会出现) - 想单独看全局配置,必须用
composer config -g --list;但注意:它只读config.json,不读auth.json,也不参与运行时合并逻辑 - 如果项目里写了
"cache-dir": "./.cache",而全局又设了cache-dir,--list显示的是项目的值——但如果你删掉项目配置,它不会自动回退成全局值,而是变成内置默认值(除非全局确实设置了)
怎么快速确认某个配置是否真在起作用?
别依赖 --list 扫一眼就下结论。它不校验合法性,也不提示冲突,更不会告诉你“这个值被环境变量覆盖了”。最直接的方式是查具体键:
- 查当前项目某配置:
composer config cache-dir(有输出就是项目级生效值) - 查全局某配置:
composer config -g github-oauth.github.com(无输出 = 未设置) - 排除插件干扰:
composer config --list --no-plugins,某些插件会偷偷改repositories或allow-plugins - 怀疑环境变量覆盖?临时清掉再试:
COMPOSER_CACHE_DIR= composer config cache-dir
常见误判场景:你在 ~/.composer/config.json 里写了 "github-oauth": {"github.com": "xxx"},但 composer config -g --list 看不到——因为 GitHub token 必须放在 auth.json,写进 config.json 是无效的,还会导致解析失败。
为什么 --list 的输出看着乱、还容易误读?
它把嵌套结构扁平化成点号路径,比如 repositories.packagist.org.type,但实际在 composer.json 里是三层嵌套对象。更麻烦的是:没有类型标识,true、null、"false" 全都原样打出,靠肉眼分不清是布尔值还是字符串。
-
composer config --list --format=json更适合脚本处理,但依然不带类型注释 - 真正要理清结构,不如直接
cat composer.json | jq '.config'(需装jq),或打开文件人工核对 -
repositories类配置尤其危险:扁平化后看不出哪个是 packagist 官方源、哪个是你自己加的私有源,一不小心就删错 - 遇到
secure-http: false这种值,得确认它来自哪一层——项目级关掉 HTTPS 可能引发安全警告,全局关掉则影响所有项目
认证类配置(GitHub/GitLab token)为什么总不生效?
这是最常踩的坑:以为 composer config -g github-oauth.github.com xxx 就完事了,结果 composer update 还是 401。根本原因在于,Composer 把认证信息和普通配置严格分离。
- OAuth token、private token 必须存进
~/.composer/auth.json,不是config.json;config -g写进去只是白写 -
auth.json权限必须是600:chmod 600 ~/.composer/auth.json,否则 Composer 会静默忽略 - 查认证配置要用
composer config -g --auth --list,不是普通--list - 环境变量
COMPOSER_AUTH优先级高于auth.json,如果设了它,--auth --list可能不显示任何内容,但认证照样走环境变量
配置本身很简单,但跨层级叠加后,vendor/autoload.php 加载行为、包下载源、甚至 PHP 平台模拟都会变——改完 platform 或 http-basic 这类配置,记得立刻 composer update --lock 同步 lock 文件,不然依赖解析可能出人意料。










