跳至內容

Rust 快取

Tuist 會快取支援的 Rust 編譯輸出,讓 Cargo 在建置輸出被移除後仍能重複使用。此快取已內建於 Tuist CLI,無需安裝獨立的快取執行檔或 Cargo 外掛程式。

實驗性編譯快取

此快取為實驗性功能,且僅在 Apple Silicon Mac 上經過驗證。在所有平台上,程式庫會依據編譯器讀取的原始碼進行快取,但 Linux 上的程式庫快取尚未經過驗證。建置腳本、程序巨集、可執行檔與原生程式碼僅在 Apple Silicon Mac 上支援快取。快取金鑰會將檢出路徑與工具鏈路徑替換為預留位置,因此在同一台機器上不同路徑的检出可以重複使用,但無法跨機器重複使用。

啟用快取#

請依照 Rust 專案設定 連接你的專案並完成驗證。接著透過 Tuist 執行建置:

bash
tuist cargo build --release

符合條件的編譯會自動啟用快取,無需額外設定快取或啟用旗標。Tuist 會根據你現有的專案與伺服器設定,自動偵測帳戶的快取端點並取得快取憑證。

若你使用 mise,請 設定 Cargo 包裝器,以便繼續輸入一般的 cargo 指令。

運作方式#

在 Cargo 啟動前,Tuist 會還原先前使用相同工具鏈、設定檔與組態所產生的 registry 與 git 相依性輸出,讓 Cargo 認為這些輸出已是最新狀態。Cargo 仍負責決定需要重新建置的內容。接著,針對 Cargo 仍會執行的每個符合條件的編譯,Tuist 會:

  1. 檢查本機快取中是否有相符的輸出。
  2. 若本機未命中,則透過遠端執行 API(REAPI)向 Kura 查詢、下載缺少的內容,並在還原前驗證輸出。
  3. 若發生快取未命中,則正常執行編譯器。編譯成功後,會將輸出儲存至本機,並在獲得授權時透過 REAPI 上傳至 Kura。只有在所有參照的內容都可取得時,才會發布遠端快取項目。

本機與 CI 建置使用相同的遠端快取協定。讀寫權限來自 Tuist 伺服器發放的快取憑證,以及你帳戶的 快取上傳政策。帳戶可以允許開發者下載,同時將上傳限制為僅限 CI 與帳戶權杖。快取寫入者是受信任的程式碼產生者:由於快取的編譯器輸出是可執行程式碼,因此只應授予你信任的機器與權杖寫入權限。

若遠端設定失敗,本機快取仍可正常使用。無法取得、遺失或損毀的快取項目會退回至編譯。上傳失敗不會導致建置失敗,也不會捨棄其本機快取項目。

可快取的內容#

快取支援:

  • 函式庫 crate,包括工作區與路徑 crate、帶有相依性的 crate,以及包含產生原始碼的 crate。Tuist 會以編譯器讀取的原始碼作為鍵值。
  • 在 Apple silicon Mac 上,對於無法預先透過原始碼檢查建立鍵值的編譯,例如使用程序巨集、內嵌組譯或原生函式庫的 crate、程序巨集本身,以及連結後的執行檔。Tuist 會記錄每個項目讀取的檔案、環境變數與唯讀指令(例如 git describe),並以此作為鍵值。
  • 在 Apple silicon Mac 上,包含使用預設 Apple 編譯器進行的 C 編譯在內的建置腳本執行。只有當其讀取的檔案、環境與指令未改變時,才會還原該次執行。
  • 警告與其他診斷訊息,這些訊息會在快取的 crate 中再次顯示。

以下項目仍會正常建置:

  • Linux 上的建置腳本與已記錄的編譯。
  • 會連線至網路、啟動 Tuist 無法觀察的程式,或在輸出目錄之外進行寫入的建置腳本。
  • 增量編譯、自訂目標,以及不支援的編譯器引數或原始碼輸入。
  • 僅含中繼資料的 cargo check 呼叫。
  • 產生非預期編譯器輸出的編譯。

既有的全域編譯器包裝器會停用 Tuist 的編譯快取與編譯器觀察器。自訂工作區包裝器也會略過快取。詳情請參閱 編譯器工具相容性。

快取鍵值包含套件內容、編譯器與工具鏈、引數,以及建置環境。檢出目錄、目標目錄、Cargo home 與工具鏈位置會以佔位符取代,因此位於其他路徑的檢出會重複使用相同的項目。若 crate 的輸出內嵌了其自身路徑(例如透過 env!("CARGO_MANIFEST_DIR")),則僅在該路徑下重複使用。憑證、Tuist 回報設定,以及可識別的 CI 執行中繼資料不會使項目失效。在編譯期間讀取這些排除變數的 crate 不會被快取。

驗證重複使用#

Cargo 原本就會避免重新建置已是最新的輸出。若要測試 Tuist 的快取而非 Cargo 的現有輸出,請先建置一次,移除 Cargo 的輸出,然後重複相同的建置:

bash
tuist cargo build --release
cargo clean
tuist cargo build --release

符合條件的函式庫可在第二次建置時還原;不支援的 crate 仍會編譯。移除 Cargo 的輸出並不會移除 Tuist 獨立的本機快取。此操作檢查的是重複使用,不一定涉及遠端下載:本機命中無需從 Kura 傳輸。輸入驗證與快取操作會帶來額外負擔,因此避免編譯並不保證小型 crate 的建置會更快。

檢查快取活動#

在專案儀表板中開啟 Cargo Cache,以檢查命中率、記錄的傳輸、延遲、吞吐量與近期建置。開啟建置的 Cache 分頁,查看個別任務決策與 CAS 輸出。

缺少的測量資料不會計為零,且快取命中不一定代表進行了遠端下載。詳情請參閱 Rust 快取測量。

疑難排解#

啟用除錯輸出以檢查快取傳輸與回報失敗:

bash
TUIST_DEBUG=1 tuist cargo build --release

除錯輸出也會說明為何未儲存某次編譯或建置腳本執行。若完全沒有命中,請確認沒有其他編譯器包裝器優先生效,且編譯器、旗標與環境與填入快取的建置相符。對於遠端上傳,也請檢查驗證與帳戶的快取上傳政策。