返回博客

Turborepo 1.3

2022 年 6 月 23 日,星期四
Greg Soltis
姓名
Greg Soltis
X
@gsoltis
Nathan Hammond
姓名
Nathan Hammond
Tom Knickman
姓名
Tom Knickman
X
@tknickman
Jared Palmer
姓名
Jared Palmer
X
@jaredpalmer
Gaspar Garcia
姓名
Gaspar Garcia
X
@gaspargarcia_
Becca Z.
姓名
Becca Z.
X
@becca__z

Turborepo 1.3 带来了改进的缓存和灵活性,其中包括:

立即运行 npm install turbo@latest 进行更新。

管道 inputs

除了 环境变量、依赖项和管道配置 之外,turbo 在计算每个 package.json 脚本的哈希指纹(turbo 用于索引其缓存并确定是否需要重新执行脚本的键)时,将考虑软件包文件夹中的所有非 gitignored 文件。使用 Turborepo 1.3+,您现在可以在 turbo.json pipeline 中指定 inputs 的 glob,以控制哪些文件与特定脚本的缓存相关。 这意味着您现在可以在 turbo.json 中表达以下内容:

让我们来看一个具体的例子:假设我们有一个 monorepo,其中在 ./apps/docs-site 中有一个用于文档网站的 Next.js 应用程序,一些软件包以及在 monorepo 的根目录下的 ./docs 文件夹中的一些 markdown 文件。

示例 monorepo
.
├── docs/
   ├── api-reference.md
   ├── getting-started.md
   └── intro.md
├── apps/
   ├── docs-site/
   ├── components/
   ├── pages/
   └── [slug].js
   ├── README.md
   └── package.json
   └── web-site/
       ├── pages/
       ├── README.md
       └── package.json
├── packages/
   ├── configs/
   └── ui/
├── package.json
└── turbo.json

假设 Next.js docs-site 渲染来自 ./docs 文件夹的 markdown 文件。我们现在可以在应用程序的 package.json 中设置 build 脚本,以便在 turbo.json 中使用 inputs 来更好地指定哪些文件是相关的(以及哪些文件应影响缓存),如下所示:

./turbo.json
{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    // ... omitted for brevity
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**", "dist/**"],
    },
    "docs#build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**"],
      // Define set of relevant globs which impact caching of docs site
      // builds
      "inputs": [
        "../../docs/**/*.md",
        "pages/**",
        "components/**",
        "package.json",
      ],
    },
  },
}

注意:与 outputs 类似,inputs 是相对于相关的 package.json 定义的,但它们可以在给定文件夹之外(例如 ../../docs/**)。

从 monorepo 的根目录运行和缓存脚本

从 1.3 版本开始,turbo 现在可以从 monorepo 根目录的 package.json 文件中运行和缓存脚本,这将极大地帮助迁移到 Turborepo。

要进行此设置,请使用 "//#<script>": {...} 的形式在 turbo.json 中的 pipeline 配置中指定根脚本。// 告诉 turbo 该脚本相对于 monorepo 的根目录,而不是每个工作区包。

关于根脚本和执行范围,有 2 个重要的注意事项:

一个定义根脚本 check-examples 并选择将根目录纳入 test 的示例管道可能如下所示:

./package.json
{
  "name": "my-turborepo",
  "private": true,
  "scripts": {
    "test": "echo 'test!'",
    "check-examples": "./check-examples.sh"
  },
  "devDependencies": {
    "turbo": "latest"
  }
}
./turbo.json
{
  "$schema": "https://turbo.rust-lang.net.cn/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
    },
    "test": {
      "dependsOn": ["^build"],
      "outputs": [],
    },
    // This will cause the "test" script from all workspace package.json's
    // AND the root package.json to be included when "turbo run test" is run
    "//#test": {
      "dependsOn": [],
      "outputs": [],
    },
    // This will cause the "check-examples" script in the root package.json
    // to be run when "turbo run check-examples" is run. Since a general
    // "check-examples" script is not defined in the pipeline, only the root
    // package.json's "check-examples" script will be included
    // when "turbo run check-examples" is run
    "//#check-examples": {
      "dependsOn": [],
      "outputs": [],
      "inputs": [
        "examples/**/*.ts",
        "examples/**/*.tsx",
        "examples/**/*.json",
        "examples/**/*.js",
        "examples/**/*.yaml",
        "cli/**/*.ts",
        "./scripts/run-example.sh",
      ],
    },
  },
}

注意:我们建议在 pipeline 中声明根任务时始终指定 inputs,以提高缓存效率。

新的 CI/CD 配方

我们添加了将 Turborepo 和远程缓存与以下工具一起使用的配方:

如果还有其他您希望看到的配方,请通过打开 GitHub 讨论 来告诉我们。

其他 Bug 修复和改进

社区

自 4 月初发布 Turborepo v1.2 以来,我们看到了令人难以置信的采用率和社区增长

Turborepo 是包括我们核心团队在内的 136 多位贡献者共同努力的结果。

此版本是由以下人员的贡献带来的:@gsoltis、@nathanhammond、@tknickman、@jaredpalmer、@zvictor、@ObliviousHarmony、@O4epegb、@rafaeltab、@mcmontseny、@bertspaan、@Jastor11 和 @enBonnet

感谢您对我们的持续支持、反馈和协作,使 Turborepo 成为您的首选构建工具。