monorepo 中 composer.json 的 version 字段基本无效,因 composer 完全忽略它,只依赖 repositories 的 path 配置和 git tag;统一版本必须通过 monorepo-builder release 显式触发,同步更新所有子包 version 并打 tag。

Monorepo 中无法靠 Composer 自身实现跨子包的统一版本号,必须用外部工具(如 monorepo-builder)驱动版本同步;手动改所有 composer.json 的 version 字段不仅易错,还会让 composer.lock 失效或引发 autoload 冲突。
为什么 composer.json 里的 version 字段在 Monorepo 中基本没用
Composer 完全忽略子包 composer.json 中的 version 字段——它只认 repositories 配置下 path 包的“存在”,不校验其 version 值。你把所有子包都写成 "version": "999.0.0",composer install 依然照常工作;但反过来,如果某子包漏写了 name 或 autoload,整个安装就会失败。
- 子包 version 不参与依赖解析,也不影响自动加载路径
- Git tag 或 release 分支名才是发布时真正起作用的版本标识
- CI 构建中若依赖
composer show vendor/package获取版本,返回的是dev-main而非你手写的数字
用 monorepo-builder release 统一打版本的实际流程
真正能落地的统一版本控制,只有通过 monorepo-builder release 命令完成:它会扫描所有子包、提取当前分支状态、批量重写 composer.json 的 version 字段,并生成对应 Git tag 和 CHANGELOG。不是“设个配置就生效”,而是每次发布都必须显式触发。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行前确保所有子包已提交且无未暂存修改,否则
monorepo-builder会拒绝操作 - 命令如
vendor/bin/monorepo-builder release patch会基于最新 tag(如v2.1.0)生成v2.1.1,并更新全部子包的version - 它不会动
require里的版本约束,所以子包之间仍需手动维护兼容性(例如myorg/core升了主版本,myorg/api的require得同步改) - 执行后必须立刻
git add . && git commit -m "chore: release v2.1.1",否则下次release会因找不到上一个 tag 报错
path 仓库 + dev-main 是唯一安全的本地开发模式
在 Monorepo 开发阶段,所有子包必须声明为 "version": "dev-main"(不能是 * 或 dev-develop),并在根 composer.json 的 repositories 中用 type: "path" 显式引入。这是让 composer install 正确建立符号链接、实现“改代码即生效”的前提。
- 路径必须是相对于根目录的正确相对路径,比如
"url": "../packages/utils",错一个../就加载失败 - 每个子包
composer.json必须有合法name(格式如myorg/utils),且不能和 Packagist 上已有包重名 - 启用
"options": {"symlink": true}后,vendor/myorg/utils是指向源码的软链,删掉再install也不会丢改动 - 别在子包里写
"minimum-stability": "dev"—— 根项目的 stability 设置已全局生效,重复写反而可能干扰解析
lock 文件在 Monorepo 中的特殊行为
composer.lock 在 Monorepo 下依然只服务根项目,它记录的是“从 path 仓库加载的子包”最终解析出的 commit hash(而非 version 字符串)。这意味着:即使你用 monorepo-builder 批量改了所有 version,只要源码没变,lock 里的 source.reference 就不变;反之,哪怕只改一行 README,lock 也会刷新 hash。
- 团队成员拉代码后必须先
composer install,不能跳过直接跑应用——因为vendor里没有符号链接,autoload 会失败 - CI 环境若用
--no-dev,要确认子包是否被误判为 dev-only 依赖(检查require-dev是否意外包含了子包) - 不要对
composer.lock做 git merge conflict 修复:冲突行大概率是不同 commit hash,应以最新main分支为准,重跑install
最常被忽略的一点:Monorepo 的版本统一,本质是 Git tag 与 monorepo-builder 输出的一致性问题,不是 Composer 配置能解决的。一旦有人绕过工具直接改 version 字段或手动打 tag,整个版本追踪链条就断了。










