如何在Monorepo架构下自动批量更新package.json版本号?
刚好我之前处理过类似的Angular monorepo版本同步问题,给你几个实用的方案,一步搞定两个package.json的版本更新:
方案1:利用npm的生命周期钩子(最推荐)
npm的version命令自带一系列生命周期钩子,其中postversion会在根版本更新完成后自动触发。我们可以用它来同步类库的版本号:
步骤1:添加脚本到根目录的package.json
在根package.json的scripts字段中加入:
{ "scripts": { "postversion": "cd projects/mylibrary && npm version --no-git-tag-version $(jq -r '.version' ../../package.json)" } }
解释:
postversion钩子:在npm version完成根版本更新后自动执行jq -r '.version' ../../package.json:读取根目录package.json的版本号(需要先安装jq工具,执行npm install -g jq即可)npm version --no-git-tag-version <版本号>:更新类库的版本,但不生成新的Git标签(根目录已经生成了,避免重复)
替代方案(不用jq)
如果不想依赖jq,可以写个简单的Node脚本sync-version.js放在根目录:
const fs = require('fs'); const path = require('path'); // 读取根项目版本 const rootPkg = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')); // 读取类库package.json const libPkgPath = path.join(__dirname, 'projects/mylibrary/package.json'); const libPkg = JSON.parse(fs.readFileSync(libPkgPath, 'utf8')); // 同步版本并写入 libPkg.version = rootPkg.version; fs.writeFileSync(libPkgPath, JSON.stringify(libPkg, null, 2) + '\n');
然后把postversion脚本改成:
"postversion": "node sync-version.js"
使用方式
现在只需要执行常规的npm version命令,比如:
npm version patch # 升级补丁版本(x.y.z+1) # 或者 npm version minor # 升级小版本(x.y+1.0) # 或者 npm version major # 升级大版本(x+1.0.0)
这条命令会自动先更新根Demo的版本,再同步到类库的package.json。
方案2:自定义一次性脚本
如果不想用生命周期钩子,也可以写一个自定义脚本,直接一次性触发两个版本更新:
在根package.json的scripts里添加:
{ "scripts": { "bump-version": "npm version $1 && cd projects/mylibrary && npm version --no-git-tag-version $1" } }
使用方式
执行时需要通过--传递版本类型参数:
npm run bump-version -- patch
这种方式不需要额外依赖,但需要手动指定版本类型,适合喜欢更直观控制的场景。
注意事项
- 如果你的Demo项目在
dependencies里引用了类库(比如"mylibrary": "file:projects/mylibrary"),版本同步后可以执行npm install确保依赖引用正常,但Angular CLI的monorepo一般会自动处理本地依赖的关联。 - 默认情况下
npm version会自动生成Git标签和提交,如果不需要自动提交,可以加上--no-git-tag-version和--no-commit-hooks参数,但保留Git操作通常更便于版本追踪。
内容的提问来源于stack exchange,提问作者BlueCaret
相关产品推荐
相关产品推荐

