composer 多模块项目中本地模块必须在主项目 composer.json 的 repositories 顶层数组中显式声明 path 类型条目,require 的包名和版本需与本地模块 composer.json 完全一致,且模块目录须已初始化 git 并启用 symlink 选项。

多模块项目里,composer.json 不是“放哪都行”,路径错一位、name 差一个字符,composer require 就静默失败——它不会报错,只会去 Packagist 找包,最后提示 Could not find package。
本地模块必须用 repositories 显式声明
Composer 不会自动扫描 modules/ 或 packages/ 目录下的子 composer.json。你得在主项目根目录的 composer.json 里手动写进每一条路径:
-
repositories必须是顶层数组,不能嵌套在config、extra或其他字段里 - 每个条目
type固定为"path",不是"package"或"vcs" -
url是相对路径(如"./modules/payment"),末尾不能带/,不支持~或环境变量 - 同名包只取第一个匹配的
path,后续重复声明完全无效
require 的包名必须和本地模块 composer.json 的 name 完全一致
大小写、分隔符、vendor 名,全部逐字比对。错一个就断连:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 本地模块
composer.json里写"name": "acme/payment",require就必须是"acme/payment": "dev-main" -
"Acme/Payment"、"acme_payment"、"acme-payment"全部不匹配 - 版本约束要对应真实存在的分支或标签:
"dev-main"要求该目录下有main分支;没打 tag 就别写"1.0.0" - 本地模块目录必须已初始化 Git(
git init && git add . && git commit -m "init"),否则 Composer 可能拒绝加载
符号链接默认不启用,改代码不生效多数是因为这个
你改了 modules/payment/src/Helper.php,但 vendor/acme/payment/src/Helper.php 还是旧的——这不是 autoload 问题,是根本没链接上:
- 软链需本地模块自己的
composer.json中声明"options": {"symlink": true} - 主项目的
composer.json配这个没用 - Windows 下需管理员权限运行终端,或开启开发者模式;Docker 容器要加
--cap-add=SYS_ADMIN - 验证是否成功:
ls -la vendor/acme/payment(Linux/macOS)应显示->指向源目录
所有依赖最终收敛到主项目 composer.lock
模块内部的 composer.lock 文件会被完全忽略。常见误操作:
- 在
modules/user/composer.json里写"monolog/monolog": "^3.0",但主项目锁死在2.9.3→ 安装失败 - 团队成员各自在模块目录下执行
composer update,却没提交主项目的composer.lock→ CI 构建失败 - 模块自己跑
composer install生成了本地lock,结果主项目更新时被覆盖,行为不一致
真正关键的只有主项目根目录那一个 composer.lock,模块只管声明 require,版本协调全交给它。










