Composer本身不支持Monorepo,所有效果依赖根composer.json中path仓库的精确配置:路径、包名、版本(须用"@dev")、symlink选项四者必须严丝合缝,缺一即加载远程包或静默失败。

Composer 本身不支持 Monorepo,所有“单仓多包”效果,全靠你在根 composer.json 里手动骗它——告诉它:“这些目录就是合法包”,且路径、名字、版本、选项四者必须严丝合缝,错一个字符就加载远程包或静默失败。
path 类型仓库必须写在根 composer.json 的 repositories 里
子包自己有再规范的 composer.json,Composer 也完全无视。它只扫描根目录下的 composer.json 中 repositories 数组声明的路径。
-
url必须是相对于根composer.json的**精确相对路径**,例如"packages/logging",不能带./,不能用绝对路径(协作必崩) - 不支持通配符递归匹配(如
"packages/*"在 Composer 2.2+ 才有限支持,且要求每个子目录下都有合法composer.json) - 若子包在
services/core/v2,就得单独加一条{"type":"path","url":"services/core/v2"},别指望自动发现 - 改完
repositories后,必须运行composer clear-cache,否则可能读旧缓存导致路径不生效
require 的包名必须和子包 composer.json 的 name 字段完全一致
大小写、连字符、斜杠方向全部敏感:"acme/utils" ≠ "Acme/Utils" ≠ "acmeutils"。写错一个,Composer 就放弃本地路径,转头去 Packagist 找同名包——不报错,但加载的是远端旧代码,这是最隐蔽的坑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 子包
composer.json中必须含非空name字段,格式为"vendor/name"(如"myorg/http-client") - 根项目
require中对应键必须一模一样,且**不能写版本约束如"^1.0"**,应统一用"*@dev"或"@dev",否则 Composer 会跳过本地源 - 子包自身
require依赖其他本地包时,同样需确保那些包也在根repositories中声明,否则依赖树解析失败
符号链接不是默认行为,得显式启用并确认环境支持
预期是 vendor/myorg/http-client 指向 packages/http-client,结果却是复制了一份?说明 symlink 没生效,Composer 退化为 copy 模式。
- 必须在
repositories条目中加"options": {"symlink": true},强制启用软链(2026 年主流版本均支持) - Windows 用户需确认终端以管理员身份运行,或已开启“开发者模式”(否则
mklink被禁用) - Linux/macOS 若仍失败,检查
vendor/所在文件系统是否挂载了noexec或nosymfollow - 软链建好后,改
packages/http-client/src/Client.php,主项目立刻可见——这是 Monorepo 开发效率的核心,别被 dump-autoload 迷惑
子包修改后 vendor 不更新?别信 dump-autoload
composer dump-autoload 只刷新自动加载映射,**完全不触发包内容同步**。改了子包代码,vendor/ 里还是旧文件,是因为 Composer 把 path 包当成“已安装”,不会自动拉新。
- 必须执行
composer update myorg/http-client --with-dependencies(注意加--with-dependencies,否则可能跳过依赖链) - 更彻底的方式:先
rm -rf vendor/myorg/http-client,再composer install或composer update - 若子包
autoload-dev需被根项目测试调用(如 PHPUnit),必须在根composer.json的autoload-dev中显式加入该路径,例如:"MyOrg\HttpClient\Tests\": "packages/http-client/tests/" - 子包自己的
autoload-dev对根项目无效,仅用于子包独立运行测试
最复杂的地方不在配置本身,而在于所有环节都依赖“完全一致”:路径拼写、包名大小写、name 字段存在性、autoload 前缀范围限定、symlink 环境权限——漏掉任一环,问题都不会立刻暴露,而是表现为类找不到、代码不生效、测试跑不通,排查成本远高于预防成本。

















