composer不支持monorepo自动发现,必须在主项目composer.json根级repositories中显式声明每个子包的path仓库,url须为相对于该composer.json的有效相对路径(如"../packages/core"),且name、autoload等字段需严格匹配,否则报错。

Composer 本身不支持 monorepo 自动发现子项目,必须显式声明每个子包的 path 仓库,且路径必须是相对于主项目 composer.json 的有效相对路径——写错一个字符、多一个斜杠、用绝对路径,都会导致 Class not found 或 Could not find package。
monorepo 目录结构与 path 仓库的映射关系
假设你的 monorepo 根目录下有 packages/core 和 apps/web,其中 apps/web 是 Laravel 应用,要依赖 packages/core:
-
packages/core/composer.json必须含"name": "acme/core"、"type": "library"、"autoload": {"psr-4": {"Acme\Core\": "src/"}} - 主项目(即
apps/web所在目录)的composer.json中,repositories必须写在根级数组里,不能嵌套 -
url值不是packages/core,而是相对于apps/web/composer.json的路径:比如"../packages/core" - 如果
apps/web和packages/core同属一个父目录(如都位于my-monorepo/下),那路径就是"../packages/core",不是"packages/core"
多个子包必须逐个声明,不支持通配符
你不能写 "url": "packages/*" 或 "url": "packages/**" —— Composer 不解析 glob,会直接跳过整个仓库。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确写法是显式列出每个包:
{"type":"path","url":"../packages/core"}、{"type":"path","url":"../packages/utils"} - 顺序很重要:
repositories数组靠前的 path 仓库优先匹配;两个仓库里若都有acme/core,只取第一个,第二个完全被忽略 - 路径中不能含空格或中文,Windows 下反斜杠
会导致静默失败,一律用正斜杠/
require 版本号必须用 dev- 分支名,不能写具体版本
path 类型仓库下,Composer 忽略子包 composer.json 中的 version 字段,只认 Git 分支名或 HEAD 所在分支。
- 写
"acme/core": "dev-main"是对的;写"acme/core": "1.0.0"会找不到包 - 如果本地
packages/core当前在develop分支,但 require 写的是dev-main,安装会失败,不会 fallback 到其他 path 仓库 - 改完
packages/core的代码后,需手动运行composer dump-autoload或删掉vendor/acme/core再composer install,否则不会更新
symlink 要主动开启,否则改代码不生效
默认行为是复制(copy),不是链接(symlink)。这意味着你在 packages/core/src/ 改了类,vendor/acme/core/src/ 里还是旧文件。
- 启用 symlink 的方式有两种:
– 在子包composer.json里加"options": {"symlink": true}
– 或全局配置:composer config --global repo.packages.type path(不推荐,影响所有项目) - 注意:
symlink只在composer install或composer update时生效,composer require不触发 - Windows 上启用 symlink 需管理员权限或开发者模式,否则会报错
failed to create symbolic link
最容易被忽略的一点:所有路径判断都以当前执行 composer install 的目录下的 composer.json 为基准——不是 monorepo 根目录,也不是子包目录。如果你在 apps/web 下运行命令,那 ../packages/core 就是对的;如果误在根目录运行,路径就得变成 packages/core,但这时 vendor 会生成到根目录,Laravel 应用反而加载不到。










