monorepo 的工具选择


前言

2024 年了,发现 monorepo 的工具,逐步变化成了 nxturborepo 了, 我有个两年前的项目,还是使用的 rush.js, 这里总结一下工具的选择吧。

有哪些方案

什么场景需要

  • 项目需要拆分成多个包,并且开发时候就需要一起调试,而不是单独的组件库那种
  • 项目发布之间有复杂的依赖关系,需要工具做管理发布的先后顺序
  • 方便 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 操作
  • 如何进行构建
  • 发包的流程是怎么样的

参考