NestJS Monorepo:子项目增量构建与独立版本化技术问询
NestJS Monorepo 两个核心问题的解决方案
一、仅构建自上次发布后变更的子项目
方法1:利用Nest CLI集成的Nx影响分析能力
Nest CLI的Monorepo底层基于Nx,自带任务缓存和变更影响分析功能,直接执行以下命令即可只构建受变更影响的子项目:
nx affected:build
默认会对比当前分支与主分支的差异,自动识别出需要构建的子项目。如果需要指定基准版本(比如上次发布的标签),可以加上--base参数:
nx affected:build --base=v1.0.0
方法2:自定义Git diff脚本
如果需要更灵活的控制,可以写脚本通过Git diff识别变更文件,映射到对应子项目后单独构建。比如一个简单的Bash脚本示例:
# 获取上次发布标签后变更的文件 CHANGED_FILES=$(git diff --name-only v1.0.0 HEAD) # 遍历变更文件,提取所属子项目 for file in $CHANGED_FILES; do PROJECT_NAME=$(echo $file | cut -d'/' -f1) # 跳过根目录文件 if [ -d "apps/$PROJECT_NAME" ] || [ -d "libs/$PROJECT_NAME" ]; then nest build $PROJECT_NAME fi done
二、实现子项目独立版本化
方法1:子项目单独维护package.json
在每个子项目的目录(apps/xxx或libs/xxx)下创建独立的package.json,定义该子项目的版本、依赖等信息。然后在根目录package.json中配置npm/yarn workspaces:
{ "workspaces": [ "apps/*", "libs/*" ] }
构建时将子项目的产物和自身的package.json一起打包,发布时直接进入子项目目录执行npm publish即可。
方法2:使用changesets工具管理版本
- 安装changesets:
npm install @changesets/cli --save-dev
- 初始化配置:
npx changeset init
- 每次子项目变更后,执行
npx changeset选择变更的子项目并标记版本变更类型(patch/minor/major)。 - 执行
npx changeset version自动更新所有子项目的版本号及依赖关系。 - 最后执行
npx changeset publish发布所有变更过的子项目。
这种方式无需给每个子项目单独建package.json,能在根package.json的结构下实现子项目独立版本化,同时自动处理子项目间的依赖版本同步。
内容的提问来源于stack exchange,提问作者Gerardo Lima
相关产品推荐
相关产品推荐

