套件和任務圖
套件圖
套件圖是由您的套件管理器建立的 Monorepo 結構。當您將內部套件彼此安裝時,Turborepo 會自動識別這些依賴關係,以建立對您工作區的基本理解。
這為任務圖奠定了基礎,您可以在其中定義任務之間的關聯方式。
任務圖
在 turbo.json
中,您可以表達任務之間的關聯方式。您可以將這些關係視為任務之間的依賴關係,但我們有一個更正式的名稱:任務圖。
须知:
您可以使用 --graph
標記為您的任務生成任務圖的可視化圖表。
Turborepo 使用一種稱為有向無環圖 (DAG) 的資料結構來理解您的儲存庫及其任務。圖由「節點」和「邊」組成。在任務圖中,節點是任務,邊是任務之間的依賴關係。有向圖表示連接每個節點的邊都有方向,因此如果任務 A 指向任務 B,我們可以說任務 A 依賴於任務 B。邊的方向取決於哪個任務依賴於哪個任務。
例如,假設您有一個 Monorepo,其中在 ./apps/web
中有一個應用程式,它依賴於兩個套件:@repo/ui
和 @repo/utils
您還有一個 build
任務,它依賴於 ^build
Turborepo 將建立如下所示的任務圖
過渡節點
建立任務圖時的一個挑戰是處理巢狀依賴關係。例如,假設您的 monorepo 有一個 docs
應用程式,它依賴於 ui
套件,而 ui
套件又依賴於 core
套件
假設 docs
應用程式和 core
套件各自都有一個 build
任務,但 ui
套件沒有。您還有一個 turbo.json
,它以與上面相同的方式配置 build
任務,即 "dependsOn": ["^build"]
。當您運行 turbo run build
時,您期望會發生什麼?
Turborepo 將建立此任務圖
您可以將此圖視為一系列步驟
docs
應用程式僅依賴於ui
。ui
套件沒有建置腳本。ui
套件的依賴套件有建置腳本,因此任務圖知道要包含這些。
在這種情況下,Turborepo 將 ui
套件稱為過渡節點,因為它沒有自己的建置腳本。由於它沒有建置腳本,Turborepo 不會為它執行任何操作,但它仍然是圖的一部分,目的是包含它自己的依賴套件。
作為入口點的過渡節點
如果 docs/
套件沒有實作 build
任務會怎麼樣?在這種情況下,您期望會發生什麼?ui
和 core
套件是否仍應執行其建置任務?這裡應該發生任何事情嗎?
Turborepo 的心智模型是任務圖中的所有節點都是相同的。換句話說,過渡節點包含在圖中,無論它們在圖中何處出現。此模型可能會產生意想不到的後果。例如,假設您已將 build
任務配置為依賴於 ^test
假設您的 monorepo 有許多應用程式和許多套件。所有套件都有 test
任務,但只有一個應用程式有 build
任務。Turborepo 的心智模型表示,當您運行 turbo run build
時,即使應用程式沒有實作 build
,所有作為依賴項的套件的 test
任務也會顯示在圖中。