Turborepo logo

套件配置

許多 monorepo 可以在根目錄中宣告一個 turbo.json,其中包含適用於所有套件的任務描述。 但是,有時 monorepo 可能包含需要以不同方式配置其任務的套件。

為了適應這種情況,Turborepo 讓您可以在任何套件中使用 turbo.json 擴展根配置。 這種彈性使更多樣化的應用程式和套件能夠在 Workspace 中共存,並允許套件擁有者維護專門的任務和配置,而不會影響 monorepo 的其他應用程式和套件。

運作方式

若要覆寫根目錄 turbo.json 中定義的任何任務的配置,請在 monorepo 的任何套件中新增一個 turbo.json 檔案,並包含頂層的 extends

./apps/my-app/turbo.json
{
  "extends": ["//"],
  "tasks": {
    "build": {
      // Custom configuration for the build task in this package
    },
    "special-task": {} // New task specific to this package
  }
}

目前,extends 鍵的唯一有效值是 ["//"]// 是一個特殊名稱,用於識別 monorepo 的根目錄。

套件中的配置可以覆寫任務的任何配置。 任何未包含的鍵都會從擴展的 turbo.json 繼承。

範例

在一個 Workspace 中使用不同的框架

假設您的 monorepo 有多個 Next.js 應用程式和一個 SvelteKit 應用程式。 這兩個框架都使用各自 package.json 中的 build 指令碼建立其建置輸出。 您可以配置 Turborepo,使用根目錄中的單個 turbo.json 執行這些任務,如下所示

./turbo.json
{
  "tasks": {
    "build": {
      "outputs": [".next/**", "!.next/cache/**", ".svelte-kit/**"]
    }
  }
}

請注意,即使 Next.js 應用程式不產生 .svelte-kit 目錄,反之亦然,.next/**.svelte-kit/** 都需要指定為 outputs

使用套件配置,您可以改為在 SvelteKit 套件的 apps/my-svelte-kit-app/turbo.json 中新增自訂配置

./apps/my-svelte-kit-app/turbo.json
{
  "extends": ["//"],
  "tasks": {
    "build": {
      "outputs": [".svelte-kit/**"]
    }
  }
}

並從根配置中移除 SvelteKit 特定的 outputs

./turbo.json
{
  "tasks": {
    "build": {
-      "outputs": [".next/**", "!.next/cache/**", ".svelte-kit/**"]
+      "outputs": [".next/**", "!.next/cache/**"]
    }
  }
}

這不僅使每個配置更容易閱讀,而且將配置更接近其使用位置。

專門任務

在另一個範例中,假設一個套件中的 build 任務 dependsOn 一個 compile 任務。 您可以普遍地將其宣告為 dependsOn: ["compile"]。 這表示您的根目錄 turbo.json 必須有一個空的 compile 任務條目

./turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["compile"]
    },
    "compile": {}
  }
}

使用套件配置,您可以將 compile 任務移至 apps/my-custom-app/turbo.json 中,

./apps/my-app/turbo.json
{
  "extends": ["//"],
  "tasks": {
    "build": {
      "dependsOn": ["compile"]
    },
    "compile": {}
  }
}

並從根目錄中移除它

./turbo.json
{
  "tasks": {
+    "build": {}
-    "build": {
-      "dependsOn": ["compile"]
-    },
-    "compile": {}
  }
}

現在,my-app 的擁有者可以完全擁有其 build 任務,但繼續繼承根目錄中定義的任何其他任務。

與套件特定任務的比較

乍看之下,套件配置可能聽起來很像根目錄 turbo.json 中的 package#task 語法。 這些功能相似,但有一個顯著差異:當您在根目錄 turbo.json 中宣告套件特定任務時,它會完全覆寫基準任務配置。 使用套件配置,任務配置會改為合併。

再次考慮具有多個 Next.js 應用程式和一個 Sveltekit 應用程式的 monorepo 範例。 使用套件特定任務,您可能會像這樣配置您的根目錄 turbo.json

./turbo.json
{
  "tasks": {
    "build": {
      "outputLogs": "hash-only",
      "inputs": ["src/**"],
      "outputs": [".next/**", "!.next/cache/**"]
    },
    "my-sveltekit-app#build": {
      "outputLogs": "hash-only", // must duplicate this
      "inputs": ["src/**"], // must duplicate this
      "outputs": [".svelte-kit/**"]
    }
  }
}

在此範例中,my-sveltekit-app#build 完全覆寫了 Sveltekit 應用程式的 build,因此 outputLogsinputs 也需要重複。

使用套件配置,outputLogsinputs 會被繼承,因此您無需重複它們。 您只需要在 my-sveltekit-app 配置中覆寫 outputs

雖然目前沒有移除套件特定任務配置的計劃,但我們預期套件配置可以在大多數使用案例中取代它。

邊界標籤 實驗性

套件配置也用於宣告邊界標籤。 為此,請將 tags 欄位新增至您的 turbo.json

./apps/my-app/turbo.json
{
+ "tags": ["my-tag"],
  "extends": ["//"],
  "tasks": {
    "build": {
      "dependsOn": ["compile"]
    },
    "compile": {}
  }
}

從那裡,您可以定義標籤可以擁有哪些依賴項或被依賴項的規則。 請查看邊界文件以獲取更多詳細資訊。

限制

雖然總體概念與根目錄 turbo.json 相同,但套件配置附帶一組護欄,可以防止套件建立潛在的混淆情況。

套件配置無法使用workspace#task 語法作為任務條目

package 是根據配置的位置推斷的,並且無法更改另一個套件的配置。 例如,在 my-nextjs-app 的套件配置中

./apps/my-nextjs-app/turbo.json
{
  "tasks": {
    "my-nextjs-app#build": {
      // ❌ This is not allowed. Even though it's
      // referencing the correct package, "my-nextjs-app"
      // is inferred, and we don't need to specify it again.
      // This syntax also has different behavior, so we do not want to allow it.
      // (see "Comparison to package-specific tasks" section)
    },
    "my-sveltekit-app#build": {
      // ❌ Changing configuration for the "my-sveltekit-app" package
      // from Package Configuration in "my-nextjs-app" is not allowed.
    },
    "build": {
      // ✅ just use the task name!
    }
  }
}

請注意,build 任務仍然可以依賴於套件特定的任務

./apps/my-nextjs-app/turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["some-pkg#compile"] 
    }
  }
}

套件配置只能覆寫 tasks 鍵中的值

在套件配置中,無法覆寫 全域配置,例如 globalEnvglobalDependencies。 需要在套件配置中更改的配置並非真正全域,應以其他方式配置。

根目錄 turbo.json 無法使用 extends

為了避免在套件上建立循環依賴,根目錄 turbo.json 無法從任何內容擴展。 extends 鍵將被忽略。

疑難排解

在大型 monorepo 中,有時可能難以理解 Turborepo 如何解釋您的配置。 為了提供協助,我們在Dry Run 輸出中新增了 resolvedTaskDefinition。 例如,如果您執行 turbo run build --dry-run,輸出將包含在執行 build 任務之前考慮的所有 turbo.json 配置的組合。