儲存庫
文件
核心概念
工作圖

工作圖

上一節討論了 Turborepo 如何使用 turbo.json 來表達任務之間的關聯性。你可以將這些關聯性視為任務之間的依賴關係,但我們有更正式的名稱:任務圖形。

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

例如,假設你有一個單一儲存庫,其中包含應用程式 apps/web,它依賴於兩個套件:@repo/ui@repo/utils

my-monorepo
└─ apps
 └─ web
└─ packages
 └─ ui
 └─ utils

以及依賴於 ^buildbuild 任務

{
  "pipeline": {
    "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.

中繼節點

在建立 Task Graph 時,處理嵌套相依性是一個挑戰。例如,假設您的 monorepo 有個 docs 應用程式,它相依於 ui 套件,而後者又相依於 core 套件

my-monorepo
└─ apps
 └─ docs
└─ packages
 └─ ui
 └─ core

假設 docs 應用程式和 core 套件各有 build 工作,但 ui 套件沒有。您也有個 turbo.json,它設定 build 工作的方式與上述相同,並使用 "dependsOn": ["^build"]。當您執行 turbo run build 時,您會預期發生什麼事?

Turborepo 將建立這個 Task Graph

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 對於它不會執行任何操作,但它仍然是圖表的一部分,目的是包含它自己的相依性。

如果我們不將中繼節點包含在圖表中,會怎樣?

在上述範例中,我們將 ui 節點(及其相依性)包含在任務圖表中。這是要確保 Turborepo 在你預期時錯過快取的重要區別。

如果預設值是排除中繼節點,則 core 套件中的原始碼變更不會使 docs 應用程式快取無效,以使用 turbo run build,使用 core 套件先前反覆運算的過時程式碼。

中繼節點作為進入點

如果 docs/ 套件未實作 build 任務,會發生什麼事?您預期會發生什麼情況?uicore 套件是否仍會執行它們的建置任務?這裡是否應該發生任何事

Turborepo 的心智模型是,任務圖表中的所有節點都是相同的。換句話說,不論中繼節點在圖表中出現在哪裡,都會包含在圖表中。此模型可能會造成意外的後果。例如,假設您已將 build 任務設定為依賴 ^test

{
  "pipeline": {
    "build": {
      "dependsOn": ["^test"]
    }
  }
}

假設你的單一儲存庫有許多應用程式和許多套件。所有套件都有 test 任務,但只有一個應用程式有 build 任務。Turborepo 的心智模型表示,當你執行 turbo run build 時,即使應用程式未實作 build,所有相依套件的 test 任務也會顯示在圖形中。