composer不支持多包自动识别,必须在根composer.json中用repositories声明path类型本地仓库,url为相对路径,版本设为*@dev,并启用symlink选项才能实现实时生效。

Composer 本身不支持多包项目自动识别,所有「本地多包能装、能改、能实时生效」的效果,全靠你在根 composer.json 里手动声明 path 类型仓库——不是靠目录结构,也不是靠子目录下有多个 composer.json,而是靠你明确告诉它:“这些路径就是合法包源”。
为什么 composer install 总是去 Packagist 装包,而不是用本地子包?
根本原因:Composer 默认只信任 Packagist,它根本不知道你本地 packages/utils 目录下有个同名包。除非你在根 composer.json 的 repositories 里显式声明路径,否则 require 行为会直接跳过本地,去远程查。
-
repositories必须写在根目录的composer.json中,子包自己的composer.json再规范也没用 -
url是相对于根目录的路径,比如子包在packages/utils,就写"packages/utils"(不能写../packages/utils或绝对路径) - 通配符只支持
"packages/*",不支持递归匹配("packages/**"无效) - 每个匹配路径下必须有完整
composer.json,且含正确name字段("myorg/utils"≠"MyOrg/Utils") - 版本约束别混用:
"*@dev"或"dev-main"可以;但写"^1.0"就可能跳过本地,优先选 Packagist 已发布的版本
如何确保修改子包代码后立即生效?
符号链接(symlink)没建成功,是开发中最隐蔽的坑之一。预期是 vendor/myorg/utils 指向 packages/utils,结果却是复制了一份文件——说明软链失败,Composer 退化为 copy 模式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须在
repositories配置中显式加"options": {"symlink": true},不能依赖默认行为 - Windows 用户需确认终端是否以管理员身份运行,或已启用“开发者模式”(否则
mklink被禁用) - Linux/macOS 上检查
vendor/所在文件系统是否挂载了noexec或nosymfollow - 最稳妥的重同步方式:删掉
vendor/myorg/utils目录,再跑一次composer install - 别信
composer dump-autoload——它只刷新自动加载映射,完全不触发包内容同步或重链接
子包之间互相依赖时,为什么总有一环走远程?
只要有一环没被 repositories 覆盖,Composer 就会去 Packagist 补全,导致混合加载、版本错乱甚至命名空间冲突。例如 user-service require data-validator,后者又 require core-utils,但 core-utils 不在 repositories 路径范围内,就会从 Packagist 安装。
- 所有被依赖的子包,都必须落在
repositories的url匹配范围内 - 不能只配
"packages/*"却把core-utils放在packages/core/v2下(通配不递归) - 推荐多条
path配置,例如同时写"packages/*"和"shared/*" - 每次修改
repositories或子包composer.json后,务必先运行composer clear-cache,否则可能读缓存导致识别失败 - 若仍不拉取本地修改,可加
--prefer-source强制检出本地路径,避免尝试下载 zip 包
真正容易被忽略的点是 autoload 冲突——它往往不是代码问题,而是 vendor/autoload.php 里生成的静态映射(ComposerAutoloaderInit)缓存了上一个项目的 PSR-4 规则,而 IDE、CLI、OPcache 都可能复用它。切换项目前不清理 vendor/,就大概率遇到 Class not found 却找不到原因。










