composer忽略子包composer.json的version字段,仅依赖git tag和path配置;统一版本必须通过monorepo-builder release显式触发,批量更新version、打tag并生成changelog,且需配合clear-cache和git commit确保生效。

为什么直接改子包composer.json里的version字段没用
因为 Composer 完全忽略子包中 version 字段——它只认 Git tag 或 repositories 的 path 配置。你把所有子包都写成 "version": "999.0.0",composer install 照常运行;但若漏了 name 或 autoload,整个安装立刻失败。子包的 version 不参与依赖解析,也不影响自动加载路径,CI 里执行 composer show vendor/package 返回的永远是 dev-main,不是你手写的数字。
monorepo-builder release才是唯一能落地的统一版本方案
真正可控的统一版本控制,必须靠 monorepo-builder release 显式触发。它会扫描所有子包、提取当前分支状态、批量重写每个子包 composer.json 的 version 字段,并打 Git tag 和生成 CHANGELOG。
- 运行前必须确保所有子包已提交且无未暂存修改,否则命令直接拒绝执行
- 命令如
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,别碰版本号
在 Monorepo 开发期,所有子包应统一设 "version": "dev-main",并在根 composer.json 的 repositories 中用 type: "path" 显式引入。这是让 composer install 正确建立符号链接、实现“改代码即生效”的前提。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
require里绝不能写"acme/user-service": "^1.0"这类带版本约束的写法——本地path包不走版本解析,应统一用"@dev"或"* @dev" - 每个
repositories条目必须含"options": {"symlink": true},否则vendor/下是复制而非软链,改子包代码不会实时反映 -
url必须是相对于根composer.json的精确路径(如"services/user-service"),不能用./开头,也不能指望"packages/*"自动递归匹配多级目录 - 改完
repositories后,必须先运行composer clear-cache,否则可能读旧缓存导致路径失效
composer.lock 提交是多人协作底线,不是可选项
composer.lock 必须提交到 Git,它是保证团队开发、测试、生产环境依赖一致的唯一可靠依据。不提交会导致各环境安装版本不一致,引发难以回溯的线上问题。
-
composer install读lock文件装指定版本,快、确定、无副作用;composer update是重算依赖树的操作,会改lock,带来兼容性风险 - CI/CD 流水线必须依赖
composer.lock才能保证构建可重现;脚本里严禁写composer update,除非你明确要刷新依赖 -
lock冲突时不要手动合并——删掉vendor/和冲突的lock,拉取最新composer.json后再跑一次composer install
统一版本不是配置开关就能开,而是每次发布都要显式触发工具链、严格遵循路径与命名规范、并靠 lock 文件锚定依赖状态。最容易被跳过的其实是 clear-cache 和 git commit -m "chore: release ..." 这两步,但缺一不可。










