Composer 2.2+ 必须使用 composer-merge-plugin(无 wikimedia/ 前缀)替代已废弃的 wikimedia/composer-merge-plugin 1.x,因后者不支持插件签名机制;配置需置于主 composer.json 顶层 extra.merge-plugin,include 路径必须以 ./ 开头,且修改后须执行 composer dump-autoload 刷新自动加载。

composer-merge-plugin 2.x 必须用 composer-merge-plugin,不是 wikimedia/composer-merge-plugin
Composer 2.2+ 默认禁用未签名插件,而旧版 wikimedia/composer-merge-plugin(1.x)不支持签名机制,composer require wikimedia/composer-merge-plugin 会静默失败或报 Plugin installation failed。你看到的“装不上”或“require 后没反应”,大概率是这个原因。
正确做法是:
- 先卸载旧插件:
composer remove wikimedia/composer-merge-plugin - 安装新包:
composer require composer-merge-plugin(注意:没有wikimedia/前缀) - 确认生效:
composer config --list | grep merge应输出extra.merge-plugin相关配置
extra.merge-plugin 配置必须在顶层,且 include 路径带 ./
插件只读取主 composer.json 的顶层 extra 字段,嵌套在 config 或其他 key 下无效。常见错误是把配置写进 config.extra,结果插件根本没加载任何文件。
include 数组里的路径是相对于当前 composer.json 的,必须以 ./ 开头(尤其在 Windows 或某些 Docker 环境下缺 ./ 会导致路径解析失败):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- ✅ 正确:
"include": ["./conf/dev.json", "./conf/prod.json"] - ❌ 错误:
"include": ["conf/dev.json"]或"include": ["conf/*.json"](通配符需引号包裹且路径仍要带./) - 被合并的 JSON 文件必须是合法 JSON,且顶层为对象(不能是数组),否则报
JSON decode error
合并后 autoload 不更新?别忘了 dump-autoload
composer-merge-plugin 只负责把 autoload、require、repositories 等字段合并进内存配置,它不会自动触发 autoloader 重建。改了 ./conf/dev.json 里的 psr-4 映射,运行 composer install 却找不到类?大概率是 vendor/autoload.php 没刷新。
- 每次修改被合并的 JSON 文件后,必须手动执行:
composer dump-autoload - 或者更彻底:
composer install --no-cache(强制重生成 autoload + 安装依赖) - CI/CD 中建议显式加这一步,避免因缓存导致本地能跑、CI 报错
多模块合并时,键冲突和加载顺序很关键
插件按 include 数组顺序合并,后加载的文件会覆盖同名键(比如两个文件都定义了 require.monolog/monolog,后面那个生效)。这不是 bug,是设计行为,但容易踩坑。
- 推荐用通配符统一管理:
"include": ["./modules/*/composer.json"],靠文件名排序控制优先级(如00-core.json、10-api.json) -
require-dev和autoload-dev默认不合并,需显式启用"merge-dev": true - 如果多个模块定义了相同命名空间映射(如都映射
App\到不同目录),最终只有最后一个生效——这种冲突不会报错,但类会加载错路径
最常被忽略的其实是 autoload 重建时机和 include 路径的 ./ 前缀,这两点不处理,其他配置再对也没用。

















