composer config --list显示的是命令行参数、环境变量、项目、全局、默认值五层叠加后最终生效的显式配置快照,项目级同名配置整块覆盖全局配置,未标注来源的即为项目级。

composer config --list 看到的值到底从哪来
直接运行 composer config --list 输出的不是“所有配置”,而是当前生效的最终值——项目级配置会整块覆盖同名全局配置,不会合并字段。比如你在项目 composer.json 里写了 "cache-dir": "/tmp/c",那哪怕全局设了 "cache-dir": "~/.composer/cache",--list 也只显示前者,且末尾不带标注;没标注的,就是项目级的。
想单独确认全局值?用 composer config --global --list。它只读 ~/.config/composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows),不混入项目配置。
常见误判:
- 改了
~/.composer/config.json但没生效 → 新版 Composer 默认不用这个路径,改~/.config/composer/config.json -
composer config repo.packagist查不到值 → 这是旧写法,Composer 2.x 要求写成repos.packagist(注意复数 + s) - 输出里有
github-oauth但你没配过 → 它只在全局生效,项目级config字段里写无效,且不会出现在--list中(属于 auth 类,走auth.json)
哪些 config 项必须写在项目 composer.json 里才管用
不是所有配置都支持全局设置。有些字段一旦写在 --global 下,就等于白写。
关键例子:
-
allow-plugins:必须放在项目composer.json的config对象里,--global设置完全被忽略。设成false会彻底禁用插件,设成数组如{"phpstan/extension-installer": true}才精准放行 -
vendor-dir和bin-dir:只作用于当前项目,改了不会影响其他项目,也不继承全局值。改完必须跑composer install --no-dev重装,否则旧目录还在,新目录为空 -
autoloader-suffix:用于隔离多个项目共用 vendor 的场景,只在项目级有效。设成"MyApp"后生成的是autoload_MyApp.php,和全局无关
反例:github-oauth、http-basic 这类认证配置,只认全局,项目级写了也加载不了。
cache-dir 和 process-timeout 在 CI 中怎么设才不翻车
CI 环境里这两个配置最容易出问题:缓存路径冲突、超时中断构建。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
cache-dir 必须是绝对路径,相对路径如 "cache" 或 "./.cache" 会静默失败。CI 推荐设为 "/tmp/composer-cache",避免和本地缓存混用导致哈希校验失败。
process-timeout 设为 0 并不能真正禁用超时,某些 PHP 版本仍 fallback 到 300 秒。实测设成 600 更可靠,尤其在拉取 GitHub Packages 或私有 GitLab 包时。
额外注意:
- 改完
cache-dir后,记得composer clear-cache,否则旧索引还在缓存里,“换源”看起来没生效 - CI 脚本里别用
--global配镜像或超时 —— 不同项目可能依赖不同源,全局配置会串包 -
process-timeout只控制 Composer 自己调用外部命令(如git clone)的等待时间,不影响你代码里的exec()
镜像配置 repos.packagist 怎么写才不被忽略
国内用户最常卡在 “Loading composer repositories”,核心就是镜像没配对。
正确写法(必须):
- 键名是
repos.packagist(不是repo.packagist,后者已废弃) - 值必须是对象,不是字符串:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - URL 必须是
https://,http://会被 Composer 2.2+ 直接拒绝 - 必须用
composer config --global repos.packagist '...'写入全局,项目级config字段不处理源地址
配完立刻执行 composer clear-cache,否则 Composer 可能还在用旧的 packagist.org 索引,看起来“没生效”。如果项目还连私有 GitLab,还得加 config.gitlab-domains,不然认证协议会错乱。
容易被忽略的一点:镜像只加速包下载,不解决 require-dev 插件未放行的问题。就算源快了十倍,allow-plugins 没配,composer require --dev phpstan/phpstan 依然会失败。










