Turborepo logo

套件和任務圖

套件圖

套件圖是由您的套件管理器建立的 Monorepo 結構。當您將內部套件彼此安裝時,Turborepo 會自動識別這些依賴關係,以建立對您工作區的基本理解。

這為任務圖奠定了基礎,您可以在其中定義任務之間的關聯方式。

任務圖

turbo.json 中,您可以表達任務之間的關聯方式。您可以將這些關係視為任務之間的依賴關係,但我們有一個更正式的名稱:任務圖。

须知:

您可以使用 --graph 標記為您的任務生成任務圖的可視化圖表。

Turborepo 使用一種稱為有向無環圖 (DAG) 的資料結構來理解您的儲存庫及其任務。圖由「節點」和「邊」組成。在任務圖中,節點是任務,邊是任務之間的依賴關係。有向圖表示連接每個節點的邊都有方向,因此如果任務 A 指向任務 B,我們可以說任務 A 依賴於任務 B。邊的方向取決於哪個任務依賴於哪個任務。

例如,假設您有一個 Monorepo,其中在 ./apps/web 中有一個應用程式,它依賴於兩個套件:@repo/ui@repo/utils

您還有一個 build 任務,它依賴於 ^build

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

Turborepo 將建立如下所示的任務圖

Task graph visualization. The diagram has one node at the top named "apps/web" with two lines that connect to other nodes, "packages/ui" and "packages/utils" respectively.

過渡節點

建立任務圖時的一個挑戰是處理巢狀依賴關係。例如,假設您的 monorepo 有一個 docs 應用程式,它依賴於 ui 套件,而 ui 套件又依賴於 core 套件

假設 docs 應用程式和 core 套件各自都有一個 build 任務,但 ui 套件沒有。您還有一個 turbo.json,它以與上面相同的方式配置 build 任務,即 "dependsOn": ["^build"]。當您運行 turbo run build 時,您期望會發生什麼?

Turborepo 將建立此任務圖

A Task Graph visualization with a Transit Node. The diagram has one node at the top named "apps/doc" with a line that connects to a "packages/ui" node. This node does not have a "build" task. The "packages/ui" node has another line to a "packages/core" node that does have a "build" task.

您可以將此圖視為一系列步驟

  • docs 應用程式僅依賴於 ui
  • ui 套件沒有建置腳本。
  • ui 套件的依賴套件有建置腳本,因此任務圖知道要包含這些。

在這種情況下,Turborepo 將 ui 套件稱為過渡節點,因為它沒有自己的建置腳本。由於它沒有建置腳本,Turborepo 不會為它執行任何操作,但它仍然是圖的一部分,目的是包含它自己的依賴套件。

作為入口點的過渡節點

如果 docs/ 套件沒有實作 build 任務會怎麼樣?在這種情況下,您期望會發生什麼?uicore 套件是否仍應執行其建置任務?這裡應該發生任何事情嗎?

Turborepo 的心智模型是任務圖中的所有節點都是相同的。換句話說,過渡節點包含在圖中,無論它們在圖中何處出現。此模型可能會產生意想不到的後果。例如,假設您已將 build 任務配置為依賴於 ^test

./turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["^test"]
    }
  }
}

假設您的 monorepo 有許多應用程式和許多套件。所有套件都有 test 任務,但只有一個應用程式有 build 任務。Turborepo 的心智模型表示,當您運行 turbo run build 時,即使應用程式沒有實作 build,所有作為依賴項的套件的 test 任務也會顯示在圖中。

小時

總計節省的計算時間
開始使用
遠端快取 →

本頁內容