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