composer的config项完全覆盖全局配置,非合并;项目级config字段优先级最高,同名键直接替换全局值,repositories等字段亦为整块替换而非追加。

composer.json 的 config 项会完全覆盖全局 config,不是合并
项目根目录下的 composer.json 中的 config 字段,优先级高于全局 ~/.composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows)中同名键。这不是“叠加”或“补充”,而是直接覆盖。
常见错误现象:composer dump-autoload 后发现 vendor/bin 下没生成脚本,但项目里明明写了 "bin": ["script.php"] —— 很可能是因为 composer.json 里配了 "bin-dir": "bin",而你期望它和全局的 "vendor/bin" 共存,实际它已把全局设置整个丢弃。
-
bin-dir必须是绝对路径,或位于vendor-dir内;否则 Composer 会静默回退到默认值(如vendor/bin),不报错也不提示 -
config不支持嵌套合并:比如全局设了{"process-timeout": 300},项目里只写{"notify-on-install": false},那process-timeout就彻底失效,不会保留为 300 - 修改后若不生效,先清缓存:
composer clear-cache;再验证是否被覆盖:composer config --list看输出里config.开头的项是否符合预期
repositories 配置互不继承,但顺序和开关决定是否生效
全局配置里的 repositories 和项目 composer.json 里的 repositories 完全隔离,不存在“项目继承全局镜像”的逻辑。真正影响包查找的是当前作用域下生效的 repositories 数组,且必须配合 {"packagist.org": false} 才能启用短路查找。
典型问题:私有源配好了却始终拉不到包,composer require myorg/private-pkg 还是去官方源找 —— 大概率是漏了禁用默认源,或 {"packagist.org": false} 放错了位置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
{"packagist.org": false}必须是repositories数组里的一个独立对象,不能嵌在其他仓库定义里 - 它必须放在所有私有源之后、数组末尾;顺序反了会导致前面的私有源被跳过
- 禁用后若还需公共包,得手动加回:
{"type": "composer", "url": "https://packagist.org"},且必须放在{"packagist.org": false}之后 - 验证当前生效源:
composer config repositories,确认输出和你写的完全一致,没有被全局配置意外覆盖
全局工具与项目工具冲突的本质是 PATH 查找顺序
运行 phpunit 却调到了旧版本,不是 Composer 配置错了,而是 shell 按 $PATH 从左到右找到了 ~/.composer/vendor/bin/phpunit,而不是项目里的 ./vendor/bin/phpunit。这不是“冲突”,是路径优先级使然。
别指望 composer config -g bin-dir 能解决这个问题——它只控制全局工具装到哪,不改变命令解析行为。
- 临时修复:在项目根目录执行
export PATH="./vendor/bin:$PATH",让项目 bin 目录优先 - CI/CD 中务必显式用
./vendor/bin/phpunit,不依赖 shell 查找 - 检查当前命中的路径:
which phpunit;再看它加载的 autoloader:head -n 3 $(which phpunit),如果路径含../vendor/autoload.php,那就是全局环境 - 避免使用
COMPOSER_BIN_DIR环境变量:它只影响新安装包的软链位置,对已有命令无任何作用
composer.json 不会自动合并,lock 文件冲突必须重建
Git 合并时出现 composer.lock 冲突,不能手动删标记、拼字段。因为 lock 文件包含 content-hash、platform 快照、packages-dev 顺序等隐式依赖,改错一个字段就会让 composer install 报 Your lock file does not contain a compatible set of packages。
而 composer.json 本身也不会被 Composer “合并”——它只读取项目根目录下唯一一份,其他 JSON 文件(包括子目录里的)完全无视。
- 解决 lock 冲突的标准流程:
git checkout --theirs composer.lock && composer install --no-scripts && composer update --lock - 如果
composer.json也有 Git 冲突,必须先人工协调完再跑上面命令;这是唯一需要比对语义的文件 - 别碰
merge-plugin:它已废弃多年,Composer 2.2+ 直接拒绝加载,强行启用会导致 autoload 丢失、require 被覆盖 - 想复用配置?用原生字段:
extra存元数据、scripts做钩子、autoload-dev支持多路径——所有内容都必须在顶层键内,否则下次composer update可能静默丢弃
config 覆盖和 repositories 隔离都是无提示的静默行为。出问题时,第一反应不该是“为什么没合并”,而是立刻用 composer config --list 和 composer config repositories 确认当前生效值,再对照你写的配置逐项核对位置、大小写、JSON 格式。










