Turborepo

封裝和任務圖

封裝圖

封裝圖是您的單一程式碼庫結構,由您的封裝管理器建立。當您將內部封裝互相安裝時,Turborepo 將自動識別這些依賴關係,以建立對您的工作區的基本理解。

這為任務圖奠定了基礎,您將在其中定義任務如何相互關聯。

任務圖

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

了解一下

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

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

例如,假設您有一個單一程式碼庫,其中 ./apps/web 中的應用程式依賴於兩個封裝:@repo/ui@repo/utils

您也有一個依賴於 ^buildbuild 任務

./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.

過渡節點

建立任務圖時的一個挑戰是如何處理巢狀依賴關係。例如,假設您的單一程式碼庫有一個依賴於 ui 封裝的 docs 應用程式,而該封裝又依賴於 core 封裝

假設 docs 應用程式和 core 封裝各自都有一個 build 任務,但 ui 封裝沒有。您也有一個 turbo.json,它使用與上述相同的 "dependsOn": ["^build"] 設定 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 封裝的依賴關係有一個 build 腳本,因此任務圖知道要包含這些依賴關係。

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

作為進入點的過渡節點

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

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

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

假設您的單一程式碼庫有許多應用程式和許多封裝。所有封裝都有 test 任務,但只有一個應用程式有 build 任務。Turborepo 的心智模型表示,當您執行 turbo run build 時,即使應用程式沒有實作 build,所有屬於依賴關係的封裝的 test 任務都會出現在圖中。

小時

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

本頁面內容