如何评价 Turborepo 这个 Monorepo 解决方案?

关注者
198
被浏览
215,207

8 个回答

Turborepo 是一个为 monorepo 而生的极快的构建系统。目的是为了解决大型 monorepo 项目构建速度缓慢的一大痛点。turbo 的核心是永远不会重新构建已经构建过的内容。turbo 会把每次构建的产物与日志缓存起来,下次构建时只有文件发生变动的部分才会重新构建,没有变动的直接命中缓存并重现日志。turbo 拥有更智能的任务调度程序,充分利用空闲 CPU,使得整体构建速度更快。另外,turbo 还具有远程缓存功能,可以与团队和 CI/CD 共享构建缓存。

trubo 可以智能的安排任务调度。首先在根项目 package.json 中定义任务的依赖关系。例如:

{
  "turbo": {
    "pipeline": {
      "build": {
        "dependsOn": ["^build"]
      "test": {
        "dependsOn": ["build"]
      "deploy": {
        "dependsOn": ["build", "test", "lint"]
      "lint": {}
}

上面描述的大致意思是:

  1. build 命令执行依赖于其依赖项的 build 命令执行完成
  2. test 命令执行依赖于自身的 build 命令执行完成
  3. lint 命令可以任何时候执行
  4. deploy 命令执行依赖于自身的 build test lint 命令执行完成

使用一条命令执行所有任务 turbo run lint build test deploy

对比像 lerna run npm/yarn workspace run 等这些传统的 monorepo task-runner 只能一次执行一个任务 。turbo 基于依赖关系智能的安排任务调度,充分利用空闲 CPU,提长整体构建速度。

turbo 可以缓存你执行过的命令生成的文件和日志,这样可以跳过已经完成的工作。默认 turbo 将构建产物及日志缓存在 node_modules/.cache/turbo/{hash} 目录下。turbo 基于包内容及依赖等诸多因素生成 hash。再次执行相同命令时 turbo 会检查缓存中是否有匹配的 hash 值。如果匹配到,则跳过任务执行,将缓存下载或移动到构建输出位置并重新打印缓存日志。

turbo 通过「智能缓存」与「任务调度」,极大的提升了构建速度,节省了计算资源。并且 turbo 配置非常简单,侵入性小,可以渐进式的采用。相信未来 turbo 会成为 monorepo 工具链上的重要一环。