composer.json的config字段完全覆盖全局配置,非合并;repositories等字段亦整块替换而非追加,认证类配置(github-oauth、http-basic)除外。

composer.json 的 config 字段会直接覆盖全局配置
项目根目录下的 composer.json 里只要写了 "config",里面所有同名键就彻底替换全局 ~/.composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows)里的值,不是合并,也不是“优先级更高”,而是整块丢弃。
常见错误现象:composer dump-autoload 后 vendor/bin 没生成脚本,但 "bin": ["script.php"] 明明写了——大概率是项目里配了 "bin-dir": "bin",它把全局的 "bin-dir": "vendor/bin" 直接抹掉了。
-
bin-dir必须是绝对路径,或位于vendor-dir内;否则 Composer 静默回退到默认值(如vendor/bin),不报错也不提示 -
cache-dir、process-timeout、github-protocols等字段,只要项目里显式声明,全局设置就失效 - 唯一例外是认证类配置:
github-oauth和http-basic支持叠加,项目可额外加,不会删掉全局的 - 修改后不生效?先
composer clear-cache,再用composer config --list看输出里config.开头的项是否符合预期
repositories 配置不继承、不合并,只看当前作用域数组
全局 config.json 里的 repositories 和项目 composer.json 里的 "repositories" 完全隔离。项目一写这个字段,全局的整个数组就被丢弃,不存在“继承镜像”或“追加私仓”的逻辑。
典型问题:私有包 myorg/private-pkg 死活拉不到,composer require 还是去官方源找——大概率漏了 {"packagist.org": false},或者把它嵌在了其他仓库对象里。
-
{"packagist.org": false}必须是repositories数组里的一个独立对象,不能塞进别的仓库定义里 - 它必须放在所有私有源之后、数组末尾;顺序反了,前面的私有源会被跳过
- 禁用后若还需公共包,得手动加回:
{"type": "composer", "url": "https://packagist.org/"},且必须放在{"packagist.org": false}之后 - 验证当前生效源:
composer config repositories,确认输出和你写的完全一致,没被全局配置意外覆盖
全局工具与项目工具冲突本质是 PATH 查找顺序
运行 phpunit 却调到了旧版本,不是配置错了,而是 shell 按 $PATH 从左到右找到了 ~/.composer/vendor/bin/phpunit,而不是项目里的 ./vendor/bin/phpunit。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
根本原因:全局 bin 路径通常在 $PATH 前面,而项目 vendor/bin 在后面——这不是 Composer 的“冲突”,是操作系统路径解析规则。
- 临时解决:进项目目录后显式执行
./vendor/bin/phpunit - 长期方案:把
./vendor/bin加到$PATH最前面(如export PATH="./vendor/bin:$PATH"),但注意这仅对当前 shell 生效 - CI/CD 脚本中务必写全路径:
./vendor/bin/phpstan,不依赖 shell 查找 - 全局
composer global require和项目composer require --dev是两套完全独立的安装流程,各自走各自的镜像源(如果配了),别指望版本自动对齐
想绕过项目 config 用全局设置?别改文件,用 COMPOSER 环境变量
某些 CI 场景需要强制用全局 bin-dir 或 process-timeout,又不能动项目 composer.json——这时不该手动删 config 段,也不该改全局配置文件,而是用 COMPOSER 环境变量指定一个精简配置。
直接设 COMPOSER=/dev/null 会让 Composer 完全忽略项目 composer.json 的 config,但也会跳过 autoload、scripts 等——只适合调试 config 本身。
- 更稳妥的做法:新建一个最小
composer.json文件,只保留{"config": {}}段落,再运行COMPOSER=path/to/minimal.json composer install - 别用
composer config --global试图“压过”项目配置——它只影响未声明的键,对已存在的config字段无效 - 插件(如
hirak/prestissimo)可能自行读取config,它们的优先级独立于 Composer 核心,不受上述规则约束
最常被忽略的点:缓存。改完配置后 composer config --list 看起来对了,但 composer install 还是老行为——先 composer clear-cache,再重试。Composer 不会自动感知配置文件变更,尤其当 vendor/ 和 composer.lock 已存在时。










