composer不识别monorepo,必须在根composer.json的repositories中显式声明path类型仓库(如"packages/utils"),否则require会默认从packagist安装;需清缓存、启用符号链接并确保所有子包路径被覆盖,否则导致本地修改不生效。

Composer 本身不识别 Monorepo,所有本地包必须显式声明为 path 类型仓库,否则 composer require 会直接去 Packagist 查找——这是 90% “装不上本地包”问题的根源。
为什么 composer require myorg/utils 还是装了 Packagist 上的老版本?
根本原因:Composer 默认只信任 Packagist,它根本不知道你本地 packages/utils 目录下有个同名包。除非你在根 composer.json 的 repositories 里明确告诉它:“这个路径下有合法包”。
-
repositories必须写在根目录的composer.json中,子包自己的composer.json里写无效 -
url是相对于根目录的路径,比如子包在packages/utils,就写"packages/utils"或通配"packages/*"(注意不支持**) - 每个匹配目录下必须有完整
composer.json,且含正确"name"字段("myorg/utils"≠"MyOrg/Utils") - 版本约束别混用:
"dev-main"、"*@dev"可以;但写"^1.0"就可能跳过本地,优先选 Packagist 已发布的 1.x - 改完
repositories或子包composer.json后,先运行composer clear-cache,否则缓存可能让改动不生效
符号链接没创建,vendor/myorg/utils 是复制出来的文件?
Composer 默认尝试软链,但失败时会静默退化为复制——这会导致改代码不生效,是开发中最隐蔽的坑之一。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Windows 用户必须启用“开发者模式”或以管理员身份运行终端,否则
mklink被禁用 - Linux/macOS 上检查
vendor/所在文件系统是否挂载了noexec或nosymfollow - 强制启用软链:在
path仓库配置里加"options": {"symlink": true} - 别信
composer dump-autoload——它只刷新自动加载映射,完全不触发包内容同步或重链接 - 最稳妥的重同步方式:删掉
vendor/myorg/utils目录,再跑一次composer install
子包之间互相依赖,比如 user-service require data-validator,后者又 require core-utils,怎么保证全链路都走本地?
只要有一环没被 repositories 覆盖,Composer 就会去 Packagist 补全,导致混合加载、版本错乱甚至命名空间冲突。
- 所有被依赖的子包,都必须落在
repositories的url匹配范围内——不能只配"packages/*"却把core-utils放在packages/core/v2下(通配不递归) - 推荐多条
path配置,例如同时写"packages/*"和"shared/*",比单条"packages"更可靠 - 如果子包 A 依赖子包 B,B 的
composer.json里写"require": {"myorg/core-utils": "dev-main"},那myorg/core-utils也必须出现在根repositories中 - 执行
composer update myorg/user-service --with-dependencies才能确保整条依赖链都被重新解析和链接
Monorepo 不是靠 Composer “自动发现”,而是靠你一条一条把路径写进 repositories,再用 dev-main 锁定开发态。漏配一个路径、少清一次缓存、Windows 没开开发者模式——任何一个点出问题,都会让热更新失效,而错误现象却常常只是“改了代码没反应”。










