Turborepo logo

快取

Turborepo 使用快取來加速建置,確保您永遠不會重複執行相同的工作。當您的任務可快取時,Turborepo 會使用首次執行任務時的指紋,從快取還原任務的結果。

12 tasks are being ran in 3 packages, resulting in a ">>> FULL TURBO" cache hit. The total time it takes to restore these tasks from cache is 80 milliseconds.

當在本機工作時,Turborepo 的快取結果可大幅節省時間,而且當啟用遠端快取,在您的整個團隊和 CI 之間共享快取時,功能更為強大。

在本頁面中,您將學到

須知: 

Turborepo 假設您的任務是決定性的。如果給定 Turborepo 知道的輸入集,任務能夠產生不同的輸出,則快取可能無法如預期運作。

命中您的第一個 Turborepo 快取

您可以透過三個步驟試用 Turborepo 的快取行為

建立新的 Turborepo 專案

使用 npx create-turbo@latest 並按照提示建立新的 Turborepo。

終端機
npx create-turbo@latest

首次執行建置

如果您已全域安裝 turbo,請在您的儲存庫中執行 turbo build

或者,您可以使用您的套件管理器在 package.json 中執行 build 指令碼。

終端機
npm run build

這將導致快取未命中,因為您從未在此儲存庫中使用此輸入集執行過 turbo。輸入會轉換為雜湊,以檢查您的本機檔案系統快取或遠端快取中是否有。

命中快取

再次執行 turbo build。您會看到類似這樣的訊息

A terminal window showing two tasks that have been ran through turbo. They successfully complete in 116 milliseconds.

由於輸入的指紋已在快取中,因此沒有理由再次從頭開始重建您的應用程式。您可以從快取還原先前建置的結果,節省資源和時間。

遠端快取

Turborepo 將任務結果儲存在您機器上的 .turbo/cache 目錄中。但是,您可以與您的隊友和 CI 共享此快取,讓您的整個組織更加快速。

若要深入了解遠端快取及其優點,請造訪遠端快取頁面

啟用遠端快取

首先,使用您的遠端快取供應商進行驗證

終端機
npx turbo login

然後,將您機器上的儲存庫連結到遠端快取

終端機
npx turbo link

現在,當您執行任務時,Turborepo 會自動將任務的輸出傳送到遠端快取。如果您在也已驗證到您的遠端快取的不同機器上執行相同的任務,則第一次執行該任務時將會命中快取。

如需有關如何將您的 CI 機器連接到遠端快取的資訊,請造訪建構 CI 指南

預設情況下,Turborepo 使用Vercel 遠端快取,無需任何設定。如果您想使用不同的遠端快取,請造訪遠端快取 API 文件

哪些內容會被快取?

Turborepo 快取兩種輸出類型:任務輸出和日誌。

任務輸出

Turborepo 快取在 turbo.jsonoutputs中定義的任務檔案輸出。當命中快取時,Turborepo 會從快取還原檔案。

outputs 鍵是選填的,請參閱API 參考,了解 Turborepo 在這種情況下的行為。

提供檔案輸出

如果您沒有為任務宣告檔案輸出,Turborepo 將不會快取它們。對於某些任務(例如程式碼檢查器)來說,這可能還可以接受,但許多任務會產生您希望快取的檔案。

如果您在命中快取時遇到檔案無法使用的錯誤,請確保您已為您的任務定義輸出。

日誌

Turborepo 始終擷取您任務的終端機輸出,並從任務首次執行時將這些日誌還原到您的終端機。

您可以使用--output-logs 旗標outputLogs 設定選項來設定重播日誌的詳細程度。

任務輸入

輸入由 Turborepo 雜湊處理,為任務執行建立「指紋」。當「指紋」匹配時,執行任務將會命中快取。

在底層,Turborepo 建立兩個雜湊:全域雜湊和任務雜湊。如果任一雜湊變更,任務將會未命中快取。

全域雜湊輸入

輸入範例
從根目錄 turbo.json 解析的任務定義
和套件 turbo.json
變更根目錄 turbo.json套件設定中的outputs
影響 Workspace 根目錄的鎖定檔變更更新根目錄 package.json 中的相依性將導致所有任務未命中快取
globalDependencies 檔案內容./.env 列在 globalDependencies 中時,變更它將導致所有任務未命中快取
globalEnv中列出的變數值變更 GITHUB_TOKEN 的值(當它列在 globalEnv 中時)
影響任務執行時間的旗標值使用行為變更旗標,例如 --cache-dir--framework-inference--env-mode
任意傳遞引數turbo buildturbo build -- --arg=diff 相比,turbo build -- --arg=value 將會未命中快取

套件雜湊輸入

輸入範例
套件設定變更變更套件的 turbo.json
影響套件的鎖定檔變更更新套件 package.json 中的相依性
套件的 package.json 變更更新套件 package.json 中的 name 欄位
原始碼控制中的檔案變更src/index.ts 中編寫新程式碼

疑難排解

使用預執行

Turborepo 有一個--dry 旗標,可用於查看如果您執行任務但不實際執行的話會發生什麼情況。當您不確定正在執行哪些任務時,這對於偵錯快取問題非常有用。

如需更多詳細資訊,請造訪--dry API 參考

使用執行摘要

Turborepo 有一個--summarize 旗標,可用於取得任務的所有輸入、輸出等等的概觀。比較兩個摘要將顯示兩個任務的雜湊為何不同。這對於以下情況非常有用

  • 偵錯輸入:Turborepo 中的任務有很多輸入。如果任務在您預期命中的時候未命中快取,您可以使用執行摘要來檢查哪些輸入是您未預期不同的。
  • 偵錯輸出:如果快取命中沒有還原您預期的檔案,執行摘要可以幫助您了解哪些輸出是從快取還原的。

摘要檢視器

雖然沒有 Turborepo 原生的執行摘要 UI 檢視器,但如果您想以網頁檢視查看您的執行摘要,我們鼓勵您使用社群建置的 https://turbo.nullvoxpopuli.com

關閉快取

有時,您可能不希望將任務的輸出寫入快取。可以使用"cache": false 為任務永久設定,或使用--no-cache 旗標為整個執行設定。

覆寫快取

如果您想要強制 turbo 重新執行已快取的任務,請使用--force 旗標。請注意,這會停用讀取快取,而不是寫入

快取任務比執行任務慢

有可能建立快取最終比不快取更慢的情況。這些情況很少見,但一些範例包括

  • 執行速度極快的任務:如果任務的執行速度比往返遠端快取的網路往返還快,您應該考慮不要快取該任務。
  • 輸出資產非常龐大的任務:有可能建立一個非常大的成品,以至於上傳或下載它的時間超過重新產生它的時間,例如完整的 Docker 容器。在這些情況下,您應該考慮不要快取該任務。
  • 具有自身快取的指令碼:某些任務有其自身的內部快取行為。在這些情況下,設定可能會變得非常複雜,以使 Turborepo 的快取和應用程式快取協同工作。

雖然這些情況很少見,但請務必測試您的專案的行為,以確定在特定位置停用快取是否能提供效能優勢。

下一步

現在您已經了解 Turborepo 的快取如何讓您的儲存庫更快,讓我們來看看如何在您的 Turborepo 中開發應用程式和程式庫。