Repo
文档
入门
添加到现有 Monorepo

将 Turborepo 添加到您的现有 Monorepo

配置工作区

turbo 是建立在工作区之上的,工作区是一种从单个 Monorepo 包中管理多个包的方式。Turborepo 与所有包管理器的 workspace 实现兼容。有关管理 Turborepo 工作区的更多信息,请参阅 工作区 文档。

您可以根据需要配置工作区,但常见的文件夹结构示例是将应用程序保存在 /apps 文件夹中,将包保存在 /packages 文件夹中。这些文件夹的配置对于每个包管理器来说是不同的。

在您的 Monorepo 的根目录 package.json 文件中指定您的 workspaces

{
  "workspaces": ["packages/*", "apps/*"]
}

配置完工作区后,重新运行包管理器的 install 命令。

安装 turbo

全局安装 turbo

npm install turbo --global

有关安装的更多详细信息,请参阅 安装 Turborepo

创建 turbo.json

在您的 Monorepo 的根目录中,创建一个名为 turbo.json 的空文件。它将保存 Turborepo 的配置。

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json"
}

创建 pipeline

要定义您的 Monorepo 的任务依赖图,请使用 pipeline 键,该键位于 Monorepo 根目录的 turbo.json 配置文件中。 turbo 会解释此配置,以最佳方式调度、执行和缓存您工作区中定义的每个 package.json 脚本的输出。

pipeline 对象中的每个键都是一个 package.json 脚本的名称,可以通过 turbo run 执行。您也可以使用 dependsOn 键在其中指定其依赖项,以及一些与 缓存 相关的其他选项。有关配置管道的信息,请参阅 Pipelines 文档。

package.jsonscripts 列表中未定义指定脚本的工作区将被 turbo 忽略。

{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "build": {
      // A package's `build` script depends on that package's
      // dependencies and devDependencies
      // `build` tasks  being completed first
      // (the `^` symbol signifies `upstream`).
      "dependsOn": ["^build"],
      // note: output globs are relative to each package's `package.json`
      // (and not the monorepo root)
      "outputs": [".next/**", "!.next/cache/**"]
    },
    "deploy": {
      // A package's `deploy` script depends on the `build`,
      // `test`, and `lint` scripts of the same package
      // being completed. It also has no filesystem outputs.
      "dependsOn": ["build", "test", "lint"]
    },
    "test": {
      // A package's `test` script depends on that package's
      // own `build` script being completed first.
      "dependsOn": ["build"],
      // A package's `test` script should only be rerun when
      // either a `.tsx` or `.ts` file has changed in `src` or `test` folders.
      "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"]
    },
    // A package's `lint` script has no dependencies and
    // can be run whenever. It also has no filesystem outputs.
    "lint": {},
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

给定包的粗略执行顺序基于 dependsOn

  1. build 在其上游依赖项运行其 build 命令后执行
  2. test 在其自身 build 命令完成后且包内没有文件系统输出(只有日志)时执行
  3. lint 按任意顺序运行,因为它没有上游依赖项
  4. deploy 在其自身 buildtestlint 命令完成后执行。

执行后,整个管道可以运行

npx turbo run deploy

turbo 然后会安排每个任务的执行,以优化机器资源的使用。

编辑 .gitignore

.turbo 添加到您的 .gitignore 文件中。CLI 使用这些文件夹来存储日志和某些任务输出。

+ .turbo

确保您的任务工件(您要缓存的文件和文件夹)也包含在您的 .gitignore 中。

+ build/**
+ dist/**
+ .next/**

重新运行您的 npm 客户端的 install 命令以检查您的配置。

构建您的 monorepo

turbo build

根据您的 monorepo 设置,某些工件可能已经正确缓存。在接下来的部分中,我们将展示 turbo 的工作原理,scope 的工作原理,以及如何在此之后使缓存正常工作。

配置远程缓存

Turborepo 速度的关键🔑在于它既懒惰又高效——它尽可能少地工作,并且尽量避免重复之前已经完成的工作。

目前,Turborepo 将您的任务缓存到本地文件系统(即“单人模式”)。但是,如果有一种方法可以利用您的队友或 CI 完成的计算工作(即“合作多人模式”)呢?如果有一种方法可以跨机器传送和共享单个缓存呢?几乎就像您的 Turborepo 缓存的“Dropbox”。

远程缓存已加入聊天。

Turborepo 可以使用一种称为远程缓存的技术来跨机器共享缓存工件,以获得额外的速度提升。

远程缓存是 Turborepo 的一项强大功能,但权力越大,责任越大。请确保您首先正确缓存,并仔细检查环境变量的处理。请记住,Turborepo 将日志视为工件,因此请注意您在控制台中打印的内容。

在本地开发中使用远程缓存

Turborepo 使用 Vercel (opens in a new tab) 作为其默认的远程缓存提供商。如果您想将本地 turborepo 链接到远程缓存,您可以将 Turborepo CLI 与您的 Vercel 帐户进行身份验证

turbo login

然后,将您的 turborepo 链接到您的远程缓存

turbo link

启用后,对您当前正在缓存的包或应用程序进行一些更改,并使用 turbo run 对其运行任务。您的缓存工件现在将存储在本地和远程缓存中。要验证此操作是否成功,请删除本地 Turborepo 缓存

rm -rf ./node_modules/.cache/turbo

再次运行相同的构建。如果一切正常,turbo 不应该在本地执行任务,而是从远程缓存中下载日志和工件,并将它们回放给您。

注意:连接到启用 SSO 的 Vercel 团队时,您必须将团队的 slug 作为参数提供给 npx turbo login

turbo login --sso-team=<team-slug>

下一步

您现在已经开始使用 Turborepo,但还有几件事要做