composer 不支持自动识别多个 composer.json,需用 path 仓库将各模块作为独立包引入,每个模块须有含 name 的 composer.json,主项目需配置 repositories 和 require,依赖关系必须显式声明,autoload 需唯一命名空间且手动 dump-autoload,composer.lock 必须记录所有模块版本以确保依赖图完整。

不能靠 composer install 自动识别多个 composer.json 文件。Composer 本身只认项目根目录下的一个 composer.json,其余子模块必须显式引入、手动建模,否则它们的依赖不会参与解析,也不会出现在 vendor/ 或 composer.lock 中。
用 path 类型仓库把模块当本地包引入
这是目前最稳定、无需额外工具链的方式。关键不是“多个配置共存”,而是让 Composer 把每个模块当成一个可安装的包来处理。
- 每个模块(如
modules/user)必须有独立的composer.json,且含"name"字段(如"myapp/user"),否则无法被 require - 主项目的
composer.json中必须声明repositories,且type为"path",url是相对路径(不带./,也不能是绝对路径) -
require字段里写的是模块的name,不是路径;版本号用"*"表示取当前本地最新提交(即dev-main或dev-develop) - 运行
composer install后,模块代码会被软链接(Linux/macOS)或复制(Windows)进vendor/myapp/user,而非保留在原位置
模块间依赖必须显式声明在 require 里
即使两个模块都在同一项目下,Composer 也不会自动推导 modules/user → modules/payment 的关系。不写,就等于没依赖。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
modules/user/composer.json的require中加一行:"myapp/payment": "*" - 确保
modules/payment也在主项目的repositories列表中,否则composer install会报Package myapp/payment not found - 如果模块 A 依赖模块 B,而模块 B 又依赖模块 C,但主项目没声明模块 C 的
repository,整个安装就会中断——Composer 不会“递归查找本地路径”
autoload 映射必须各自配置,且不能冲突
PSR-4 映射不是全局合并的,而是按包加载。如果两个模块都映射到 App\,运行时会因类重复定义或覆盖失败而报错。
- 每个模块的
composer.json应使用唯一命名空间,如"MyApp\User\": "src/"和"MyApp\Payment\": "src/" - 主项目的
autoload只负责自身代码,不自动继承子模块的 autoload 配置;子模块的 autoload 由 Composer 在生成vendor/autoload.php时自动合并进去 - 执行
composer dump-autoload才能刷新所有包的自动加载映射,开发中改了模块的autoload后必须手动触发
私有模块 + 本地 path 时,composer.lock 必须真实记录版本
如果你看到图谱里某个模块显示 [dev-main] 而不是语义化版本(如 1.2.0),说明 Composer 没法从 composer.lock 提取可信版本号——这会导致交互式依赖图无法正确标注约束与实际安装版本的差异。
- 确保所有模块都已执行过
composer install(哪怕只是空的composer.json),让composer.lock生成对应条目 - 模块的
composer.json中建议加上"version": "1.0.0"字段(仅用于本地调试,不影响 Packagist 发布) - 若模块通过
path引入但未出现在composer.lock的packages或packages-dev下,composer-dependency-graph就会跳过它,导致依赖链断裂
真正难的不是配置多份 composer.json,而是让 Composer 相信这些模块是“可验证的包”——名字唯一、路径可达、autoload 不重叠、lock 文件有迹可循。少一个环节,依赖树就断一截。










