套件配置
許多 monorepo 可以在根目錄中宣告一個 turbo.json
,其中包含適用於所有套件的任務描述。 但是,有時 monorepo 可能包含需要以不同方式配置其任務的套件。
為了適應這種情況,Turborepo 讓您可以在任何套件中使用 turbo.json
擴展根配置。 這種彈性使更多樣化的應用程式和套件能夠在 Workspace 中共存,並允許套件擁有者維護專門的任務和配置,而不會影響 monorepo 的其他應用程式和套件。
運作方式
若要覆寫根目錄 turbo.json
中定義的任何任務的配置,請在 monorepo 的任何套件中新增一個 turbo.json
檔案,並包含頂層的 extends
鍵
目前,extends
鍵的唯一有效值是 ["//"]
。 //
是一個特殊名稱,用於識別 monorepo 的根目錄。
套件中的配置可以覆寫任務的任何配置。 任何未包含的鍵都會從擴展的 turbo.json
繼承。
範例
在一個 Workspace 中使用不同的框架
假設您的 monorepo 有多個 Next.js 應用程式和一個 SvelteKit 應用程式。 這兩個框架都使用各自 package.json
中的 build
指令碼建立其建置輸出。 您可以配置 Turborepo,使用根目錄中的單個 turbo.json
執行這些任務,如下所示
請注意,即使 Next.js 應用程式不產生 .svelte-kit
目錄,反之亦然,.next/**
和 .svelte-kit/**
都需要指定為 outputs
。
使用套件配置,您可以改為在 SvelteKit 套件的 apps/my-svelte-kit-app/turbo.json
中新增自訂配置
並從根配置中移除 SvelteKit 特定的 outputs
這不僅使每個配置更容易閱讀,而且將配置更接近其使用位置。
專門任務
在另一個範例中,假設一個套件中的 build
任務 dependsOn
一個 compile
任務。 您可以普遍地將其宣告為 dependsOn: ["compile"]
。 這表示您的根目錄 turbo.json
必須有一個空的 compile
任務條目
使用套件配置,您可以將 compile
任務移至 apps/my-custom-app/turbo.json
中,
並從根目錄中移除它
現在,my-app
的擁有者可以完全擁有其 build
任務,但繼續繼承根目錄中定義的任何其他任務。
與套件特定任務的比較
乍看之下,套件配置可能聽起來很像根目錄 turbo.json
中的 package#task
語法。 這些功能相似,但有一個顯著差異:當您在根目錄 turbo.json
中宣告套件特定任務時,它會完全覆寫基準任務配置。 使用套件配置,任務配置會改為合併。
再次考慮具有多個 Next.js 應用程式和一個 Sveltekit 應用程式的 monorepo 範例。 使用套件特定任務,您可能會像這樣配置您的根目錄 turbo.json
在此範例中,my-sveltekit-app#build
完全覆寫了 Sveltekit 應用程式的 build
,因此 outputLogs
和 inputs
也需要重複。
使用套件配置,outputLogs
和 inputs
會被繼承,因此您無需重複它們。 您只需要在 my-sveltekit-app
配置中覆寫 outputs
。
雖然目前沒有移除套件特定任務配置的計劃,但我們預期套件配置可以在大多數使用案例中取代它。
邊界標籤 實驗性
套件配置也用於宣告邊界標籤。 為此,請將 tags
欄位新增至您的 turbo.json
從那裡,您可以定義標籤可以擁有哪些依賴項或被依賴項的規則。 請查看邊界文件以獲取更多詳細資訊。
限制
雖然總體概念與根目錄 turbo.json
相同,但套件配置附帶一組護欄,可以防止套件建立潛在的混淆情況。
套件配置無法使用workspace#task
語法作為任務條目
package
是根據配置的位置推斷的,並且無法更改另一個套件的配置。 例如,在 my-nextjs-app
的套件配置中
請注意,build
任務仍然可以依賴於套件特定的任務
套件配置只能覆寫 tasks
鍵中的值
在套件配置中,無法覆寫 全域配置,例如 globalEnv
或 globalDependencies
。 需要在套件配置中更改的配置並非真正全域,應以其他方式配置。
根目錄 turbo.json 無法使用 extends
鍵
為了避免在套件上建立循環依賴,根目錄 turbo.json
無法從任何內容擴展。 extends
鍵將被忽略。
疑難排解
在大型 monorepo 中,有時可能難以理解 Turborepo 如何解釋您的配置。 為了提供協助,我們在Dry Run 輸出中新增了 resolvedTaskDefinition
。 例如,如果您執行 turbo run build --dry-run
,輸出將包含在執行 build
任務之前考慮的所有 turbo.json
配置的組合。