单包工作空间

虽然 Turborepo 在多包工作空间(通常称为 monorepos)中非常有效,但它也可以用于加速单包工作空间

Turborepo 的大多数重要功能在单包工作空间中都可以使用,包括本地和远程缓存以及任务并行化。不能使用的功能是那些在单包上下文中没有意义的功能,比如包任务(app#build)。

Good to know: 

单包工作空间的例子包括 npx create-next-appnpm create vite 的输出。

安装

在你的应用中安装 turbo

Terminal
npm install turbo --save-dev

使用全局 turbo 运行 package.json 脚本(可选)

为了获得更快的开发工作流程,你也可以全局安装 turbo,并直接从命令行运行命令。

安装完成后,你可以运行 turbo build,Turborepo 将运行你的 package.json 中的 build 脚本。再次运行 turbo build 将命中缓存。

在这一点上,turbo 并没有提供太多价值,因为你可能只在代码更改时重新构建应用程序,而当代码更改时,turbo 将错过缓存。通过两个简短的步骤,你可以从 turbo 中获得更多价值。

用一个命令运行多个脚本

在许多仓库中,都有设置任务或预构建步骤要运行。这些任务通常是一次运行一个 - 但你可以使用 turbo 轻松地将它们转换为一个脚本。

例如,假设你有一个项目,每当你开始工作时都需要设置开发环境。你需要:

  1. 启动数据库的 Docker 容器。
  2. 将数据库架构推送到数据库。
  3. 用数据填充数据库。
  4. 启动开发服务器。

你可以使用 Turborepo 将这些任务安排到一个命令中。首先,在你的 package.json 中创建脚本:

package.json
{
  "name": "@acme/my-app",
  "version": "0.0.0",
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "check-types": "tsc --noEmit",
    "db:up": "docker-compose up -d",
    "db:push": "your-orm-tool schema-push",
    "db:seed": "node ./db-seed.js"
  }
}

然后,在 turbo.json 中创建任务来按顺序运行这些脚本:

Turborepo logo
./turbo.json
{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "dev": {
      "dependsOn": ["db:seed"],
      "cache": false,
      "persistent": true
    },
    "db:seed": {
      "dependsOn": ["db:push"],
      "cache": false
    },
    "db:push": {
      "dependsOn": ["db:up"],
      "cache": false
    },
    "db:up": {
      "cache": false
    }
  }
}

上面任务中的 dependsOn 数组为任务创建了顺序。当你运行 turbo dev 时,将首先运行 db:up,然后是 db:push,最后是 db:seed 的脚本。

并行化任务

使用 turbo 并行化任务可以通过一次运行所有可能的任务来加速任务。例如,你可以同时运行 ESLint、TypeScript 和 Prettier 检查。给定如下脚本:

./package.json
{
  "scripts": {
    "lint": "eslint .",
    "format": "prettier .",
    "check-types": "tsc --noEmit"
  }
}

你可以创建像这样的配置:

Turborepo logo
turbo.json
{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "lint": {},
    "format": {},
    "check-types": {}
  }
}

然后,要同时运行所有任务:

Terminal
turbo check-types lint format

使用输入优化任务

因为 Turborepo 会将单包工作空间视为一个包,所以可以通过优化任务的输入来确保不相关的更改不会导致缓存未命中。

例如,使用 tsc --noEmit 检查类型的脚本可以配置为只包含 TypeScript 文件的输入:

Turborepo logo
./turbo.json
{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "check-types": {
      "inputs": ["**/*.{ts,tsx}"]
    }
  }
}