Turborepo 1.6

2022年10月21日,星期五
Matt Pocock
姓名
Matt Pocock
X
@mattpocockuk
Greg Soltis
姓名
Greg Soltis
X
@gsoltis
Nathan Hammond
姓名
Nathan Hammond
Tom Knickman
姓名
Tom Knickman
X
@tknickman
Anthony Shew
姓名
Anthony Shew
X
@anthonysheww
Jared Palmer
姓名
Jared Palmer
X
@jaredpalmer
Mehul Kar
姓名
Mehul Kar
X
@mehulkar
Chris Olszewski
姓名
Chris Olszewski

Turborepo 1.6 改变了 Turborepo 的游戏规则 - 你现在可以在任何项目中使用它。

立即更新,运行 npm install turbo@latest

任何代码库都可以使用 Turborepo

Turborepo 帮助加速代码库中的任务。 到目前为止,我们专门为 monorepo 构建了 Turborepo - 包含多个应用程序和包的代码库。

Turborepo 在 monorepo 中非常出色,因为它们有许多任务要处理。 每个包和应用程序都需要构建、代码检查和测试。

但我们开始思考: 许多不是 monorepo 的代码库也运行大量任务。 大多数 CI/CD 流程都做了很多重复的工作,这些工作可以从 缓存 中受益。

因此,我们很高兴地宣布,任何代码库现在都可以使用 Turborepo

立即尝试 从示例开始,或者将 Turborepo 添加到现有项目中

将 Turborepo 添加到你的项目

  1. 安装 turbo
终端
npm install turbo --save-dev
  1. 在你的新仓库的根目录下添加一个 turbo.json 文件
./turbo.json
{
  "pipeline": {
    "build": {
      "outputs": [".next/**", "!.next/cache/**"]
    },
    "lint": {
      "outputs": []
    }
  }
}
  1. 尝试使用 turbo 运行 buildlint
终端
turbo build lint

恭喜 - 你刚刚使用 turbo 运行了你的第一个构建。 你可以尝试

我应该在什么时候使用 Turborepo?

Turborepo 可用于非 monorepo,这开辟了许多新的用例。 但它在什么时候表现最佳呢?

当脚本相互依赖时

你应该使用 turbo 来运行你的 package.json 脚本。 如果你有多个相互依赖的脚本,你可以将它们表示为 Turborepo 任务

turbo.json
{
  "pipeline": {
    "build": {
      "outputs": ["dist/**"]
    },
    "lint": {
      // 'build' should be run before 'lint'
      "dependsOn": ["build"]
    },
    "test": {
      // 'build' should be run before 'test'
      "dependsOn": ["build"]
    }
  }
}

然后,你可以运行

终端
turbo run lint test

因为你已经声明 build 应该在 linttest 之前运行,所以当你运行 linttest 时,它会自动为你运行 build

不仅如此,它还会为你找出最佳的调度方案。 请访问我们的核心概念文档,了解 如何优化速度

当你想并行运行任务时

假设你正在运行一个 Next.js 应用程序,并且还在运行 Tailwind CLI。 你可能有两个脚本 - devdev:css

package.json
{
  "scripts": {
    "dev": "next",
    "dev:css": "tailwindcss -i ./src/input.css -o ./dist/output.css --watch"
  }
}

在没有向你的 turbo.json 添加任何内容的情况下,你可以运行

终端
turbo run dev dev:css

就像 concurrently 这样的工具一样,Turborepo 将自动并行运行这两个脚本。

这对于开发模式非常有用,但也可以用于加速 CI 上的任务 - 想象一下你有多个脚本要运行

终端
turbo run lint unit:test e2e:test integration:test

Turborepo 将找出并行运行所有任务的最快方法。

Prune 现在支持 npm

在过去的几个版本中,我们一直在为不同的工作区管理器添加对 turbo prune 的支持。 这一直是一个挑战 - turbo prune 创建你的 monorepo 的子集,包括修剪你的 lockfile 中的依赖项。 这意味着我们必须为每个工作区管理器单独实现逻辑。

我们很高兴地宣布 turbo prune 现在支持 npm,从而完成了对所有主要包管理器的支持。 这意味着,如果你的 monorepo 使用 npmyarnyarn 2+pnpm,你将能够轻松部署到 Docker。

查看我们之前关于 turbo prune 的博客 以了解更多信息。

缓存的性能改进

在 1.6 之前,Turborepo 的本地缓存是将系统上的文件递归复制到磁盘上的另一个位置。 这很慢。 这意味着对于我们需要缓存的每个文件,我们需要执行六个系统调用: 打开、读取和关闭源文件; 打开、写入和关闭目标文件。

在 1.6 中,我们将其减少了近一半。 现在,在创建缓存时,我们创建一个单独的 .tar 文件(一次打开),我们以 1mb 的块写入它(批量写入),然后关闭它(一次关闭)。 系统调用的减半发生在从缓存中取回数据时。

而且我们并没有止步于此。 在过去一个月中,我们在构建工具链上进行了大量投资,以启用 CGO,从而解锁对用 C 编写的一流库的使用。 这使我们能够采用 Zstandardlibzstd 进行压缩,这为我们带来了算法上的 3 倍压缩性能提升。

在所有这些更改之后,我们经常看到本地缓存创建的性能提升超过 2 倍,远程缓存创建的性能提升超过 3 倍。 你的仓库越大,或者你的设备越慢(说的就是你,CI),情况就越好。 这意味着我们已经能够精确地为那些最需要它的人提供性能提升。