自动化进阶导学:nx&lerna&turborepo&rush
概述
本节扩展分析业界主流 CLI 工具的代码组织方式,对比 NestJS CLI、Nx CLI 的模板生成策略,并介绍 Monorepo 管理工具生态(Nx、Lerna、Turborepo、Rush)。
CLI 工具的模板策略对比
| 策略 | 代表项目 | 原理 | 优缺点 |
|---|---|---|---|
| 文件拷贝 | create-vue | 预置模板目录,直接复制 | 简单直接,但灵活性有限 |
| 依赖包模板 | NestJS CLI | 模板作为 npm 依赖,通过 devkit 渲染 | 灵活但依赖复杂 |
| 插件式模板 | Nx CLI | 使用 schematic/devkit 生成器 | 最灵活,学习成本最高 |
| 混合模式 | create-admin-template | prompts + 文件拷贝 | 轻量实用 |
NestJS CLI 的模板组织
@nestjs/cli
├── src/ # 逻辑代码
│ ├── commands/ # CLI 命令
│ ├── actions/ # 执行动作
│ └── utils/ # 工具函数
├── package.json # 依赖中包含模板
│ ├── @nestjs/schematics # 核心模板定义
│ └── @angular-devkit/ # 模板渲染引擎
│ ├── core # 核心能力
│ ├── schematics # 模板系统
│ └── utils # 工具方法
text
NestJS 借鉴了 Angular 的 DevKit 体系,模板定义在 @nestjs/schematics 中,通过 @angular-devkit/schematics 引擎进行渲染。
Monorepo 管理工具全景
工具定位对比
| 工具 | 核心定位 | 构建缓存 | 任务编排 | 学习曲线 |
|---|---|---|---|---|
| Nx | 全能型 Monorepo 平台 | 本地 + 远程 | 智能依赖图 | 中高 |
| Lerna | 经典包管理工具 | 无(需配合 Nx) | 基础 | 低 |
| Turborepo | 高性能构建编排 | 本地 + 远程 | 并行管道 | 低 |
| Rush | 企业级 Monorepo | 通过插件 | 分 phase 管理 | 高 |
| pnpm workspace | 基础工作空间 | 无 | 无 | 最低 |
Nx 核心能力
# 安装
npx create-nx-workspace@latest
# 项目结构
my-workspace/
├── apps/ # 应用
│ ├── admin-app/
│ └── mobile-app/
├── libs/ # 共享库
│ ├── ui-components/
│ └── utils/
├── nx.json # Nx 配置
└── workspace.json # 工作空间配置
bash
// nx.json - 缓存与任务配置
{
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "test", "lint"]
}
}
},
"targetDefaults": {
"build": {
"dependsOn": ["^build"],
"outputs": ["{projectRoot}/dist"]
}
}
}
json
Turborepo 核心配置
// turbo.json
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"],
"outputs": []
},
"lint": {
"outputs": []
}
}
}
json
Rush 特性
- 分 Phase 管理:每个 phase 按拓扑排序执行,严格控制构建顺序
- 版本策略:支持锁定文件、批量版本管理和变更日志生成
- 企业级特性:审批流程、环境检查、构建缓存插件
# Rush 项目初始化
rush init
# 常用命令
rush install # 安装所有依赖
rush build # 按依赖顺序构建
rush publish # 批量发布
rush change # 记录变更
bash
工具选型建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 小型 Monorepo(2-5 包) | pnpm workspace | 零配置,够用 |
| 中型项目(5-20 包) | Turborepo | 低学习成本,构建加速 |
| 大型企业级项目 | Nx | 功能全面,智能依赖分析 |
| 需要严格发布流程 | Rush | 企业级版本管理 |
| 已有 Lerna 项目 | Lerna + Nx | 渐进迁移 |
小结
- 业界 CLI 工具从简单的文件拷贝到复杂的模板引擎,各有适用场景
- NestJS 借助 Angular DevKit 实现灵活的模板生成系统
- Monorepo 工具生态丰富:Nx 全能、Turborepo 高效、Rush 企业级
- 选择工具时根据团队规模、项目复杂度和学习预算综合考量
↑