monorepo 的工具选择
前言
2024 年了,发现 monorepo 的工具,逐步变化成了 nx
和 turborepo
了, 我有个两年前的项目,还是使用的 rush.js
, 这里总结一下工具的选择吧。
有哪些方案
- pnpm workspace, 这是个底层的技术,其他产品很多是基于他做的封装, 比如 使用的示例是 Monorepo 工程介绍 - Modern.js
- rush.js, 也可以选择 pnpm workspace 作为管理方案
- turborepo, 示例 t3-oss/create-t3-turbo: Clean and simple starter repo using the T3 Stack along with Expo React Native
- nx,对构建有自己一套封装
什么场景需要
- 项目需要拆分成多个包,并且开发时候就需要一起调试,而不是单独的组件库那种
- 项目发布之间有复杂的依赖关系,需要工具做管理发布的先后顺序
- 方便
npm
包的调试,项目之间通过workspace:<name>
指定 - 对构建能提供并行和加速的能力
- 对发布版本有流程化的管理
解决什么痛点
- 幽灵依赖问题: 依赖的包的依赖, 没有声明,也会被提升到顶层,导致没有申明的包也能被使用,不安全。
- Rush 如何解决问题的: rush install 指令可以扫描所有潜在的父目录并在发现 node_modules 中存在幻影依赖时发出警告。
- pnpm 是有严格的依赖包管理,不会出现幽灵依赖问题
- NPM 分身 | Rush, pnpm 是能这个问题的唯一选择
- 构建任务之间的依赖管理,包之间的依赖管理, pnpm workspace 能识别,但包自身的构建流程, 并发控制可以由工具解决。
如果不使用的话
- 比如我们就是单独开发一个
npm
包,本地就pnpm link
或者yalc
调试就好了。
使用流程
- 最好每个项目,都是能独立依赖管理,独立的启动脚本, 工具只是辅助效果
最初级的 pnpm workspace
pnpm workspace 主要管理的是项目之间包的依赖和 link 问题。
进一步结合其他工具
比如 Lerna 可以键盘发版本问题。
大体流程
- 如何初始化一个
monorepo
, 比如建立好pnpm workspace
的目录结构,哪些是可以workspace:
识别的 - 如何安装依赖, 是全局依赖性质的, 比如
git-cz
, 如果是 rush.js, 没有package.json
,就需要在common
里面安装 - 是全部子项目都需要的依赖, 还是部分子项目需要的
- 如何启动开发环境,是顶层命令,还是进入子包,像开发子包一样正常启动
- 如何进行 lint 操作
- 如何进行构建
- 发包的流程是怎么样的