必须在主项目根目录composer.json的repositories数组中声明path仓库,子模块自己的composer.json中配置无效;url需为相对路径,本地包须含合法composer.json且name、version与require严格一致。

composer.json里写path仓库,必须放在主项目根目录
子模块自己的composer.json里配repositories完全无效。Composer只读主项目根目录下的composer.json,不会递归扫描子目录。常见错误是把path配置塞进modules/user/composer.json,结果composer install压根不识别那个路径。
正确写法是在主项目composer.json的repositories数组里显式声明:
{
"repositories": [
{
"type": "path",
"url": "modules/user"
},
{
"type": "path",
"url": "modules/payment"
}
],
"require": {
"myorg/user": "dev-main",
"myorg/payment": "dev-main"
}
}
-
url必须是相对于主项目composer.json的路径,不能用~/、$HOME或环境变量 - 每个模块目录(如
modules/user)下必须有合法composer.json,且name字段要和require中完全一致(包括vendor前缀) - 模块目录需已执行
git init并至少有一个commit,否则Composer拒绝加载
path仓库要求模块有完整元数据,缺一不可
Composer把path仓库当真实包处理,不是简单挂载文件夹。如果模块的composer.json里没写name或version,运行composer install会报Could not find a matching version of package myorg/user——这不是网络问题,是元数据缺失。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
name必须与require中的包名严格一致,比如"name": "myorg/user" -
version可以是"dev-main"、"1.0.x-dev"等开发版本标识,但不能空着 - 若模块用
psr-4自动加载,其autoload段落里的命名空间和路径也要对应实际代码结构,否则类找不到
生成的符号链接位置固定,无法用config.vendor-dir改
启用path类型仓库后,Composer默认在vendor/下为每个模块建软链接,指向本地路径。这个行为由Composer内建逻辑控制,config.vendor-dir只影响第三方包安装位置,对path仓库生成的链接无效。
- 链接目标始终是
vendor/myorg/user→../modules/user,不会随vendor-dir变化 - 想把链接挪到别处?只能手动删掉
vendor/myorg/user,再用ln -sf重链到想要的位置 - CI/CD脚本里若依赖
vendor/myorg/user存在,就不能指望vendor-dir配置让它自动迁移
多模块协同时,composer.lock必须提交,且不能忽略.gitignore
composer.lock记录的是各模块的绝对路径哈希,不是版本号。一旦你移动了modules/user目录,或队友拉代码时路径不一致,composer install就会失败或加载错版本。
- 所有
modules/目录必须纳入.gitignore的排除范围,否则Git会误提交二进制或缓存文件 - 但
modules/*/composer.json和modules/*/src/这类源码必须可被Git跟踪 - 团队协作前,先统一
modules/的相对路径约定,避免有人用../shared-modules/user导致路径错乱
最易被忽略的是模块composer.json里type字段的副作用:如果设了"type": "wordpress-plugin",又没装对应installer,Composer可能跳过自动加载注册——哪怕路径是对的,new UserRepo()照样报Class not found。










