多语言支持

Turborepo 基于 JavaScript 生态系统的约定来查找要执行的脚本和任务 - 但它并不关心这些脚本做什么。 遵循在 JavaScript 工作区中指定包的指南,你可以将任何其他语言或工具链添加到 Turborepo。

例如,你的仓库中可能有一个 Rust 项目在 ./cli 目录中。 要将此目录作为包添加到你的 JavaScript 包管理器的工作区,请将该目录添加到工作区定义中

pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"
  - "cli"
pnpm 工作区文档

然后,在目录中添加一个 package.json

./cli/package.json
{
  "name": "@repo/rust-cli",
  "scripts": {
    "build": "cargo build --release"
  }
}

现在,当你使用 turbo build 时,./cli/package.json 中的 "build" 脚本将被包含在 turbo 运行的任务中。

缓存构建产物

确保你的构建输出通过 outputs 键turbo.json 中进行缓存。 如果是使用 cargo 编译的 Rust CLI,则会在 target/release 目录中创建一个 release 构建,我们可以使用以下方式缓存它

Turborepo logo
./turbo.json
{
  "tasks": {
    "build": {
      "outputs": ["target/release/**"] 
    }
  }
}

创建依赖关系

因为该目录现在是包管理器工作区的一部分,所以你可以像为 JavaScript 包创建依赖关系一样创建依赖关系。

例如,如果你想确保先构建上面的 rust-cli “包”,然后再构建你的 web 应用程序,请将其安装到 web 应用程序的依赖项中

./web/package.json
{
  "devDependencies": {
+   "@repo/rust-cli": "workspace:*"
  }
}

给定一个包含 build 任务的 turbo.json,例如

Turborepo logo
./turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", "target/release/**"]
    }
  }
}

turbo build 将首先为 Rust CLI 创建产物,然后构建 web 应用程序。