快取
Turborepo 使用快取來加速建置,確保您永遠不會重複執行相同的工作。當您的任務可快取時,Turborepo 會使用首次執行任務時的指紋,從快取還原任務的結果。
當在本機工作時,Turborepo 的快取結果可大幅節省時間,而且當啟用遠端快取,在您的整個團隊和 CI 之間共享快取時,功能更為強大。
在本頁面中,您將學到
須知:
Turborepo 假設您的任務是決定性的。如果給定 Turborepo 知道的輸入集,任務能夠產生不同的輸出,則快取可能無法如預期運作。
命中您的第一個 Turborepo 快取
您可以透過三個步驟試用 Turborepo 的快取行為
首次執行建置
如果您已全域安裝 turbo
,請在您的儲存庫中執行 turbo build
。
或者,您可以使用您的套件管理器在 package.json
中執行 build
指令碼。
這將導致快取未命中,因為您從未在此儲存庫中使用此輸入集執行過 turbo
。輸入會轉換為雜湊,以檢查您的本機檔案系統快取或遠端快取中是否有。
由於輸入的指紋已在快取中,因此沒有理由再次從頭開始重建您的應用程式。您可以從快取還原先前建置的結果,節省資源和時間。
遠端快取
Turborepo 將任務結果儲存在您機器上的 .turbo/cache
目錄中。但是,您可以與您的隊友和 CI 共享此快取,讓您的整個組織更加快速。
若要深入了解遠端快取及其優點,請造訪遠端快取頁面。
啟用遠端快取
首先,使用您的遠端快取供應商進行驗證
然後,將您機器上的儲存庫連結到遠端快取
現在,當您執行任務時,Turborepo 會自動將任務的輸出傳送到遠端快取。如果您在也已驗證到您的遠端快取的不同機器上執行相同的任務,則第一次執行該任務時將會命中快取。
如需有關如何將您的 CI 機器連接到遠端快取的資訊,請造訪建構 CI 指南。
預設情況下,Turborepo 使用Vercel 遠端快取,無需任何設定。如果您想使用不同的遠端快取,請造訪遠端快取 API 文件
哪些內容會被快取?
Turborepo 快取兩種輸出類型:任務輸出和日誌。
任務輸出
Turborepo 快取在 turbo.json
的 outputs
鍵中定義的任務檔案輸出。當命中快取時,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 build 或 turbo 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 中開發應用程式和程式庫。