本文說明如何在 Fuchsia 開發環境中,設定及使用 Bazel 構件的本機磁碟快取。
總覽
Fuchsia 建構系統會使用 Bazel 建構系統的特定部分。
根據預設,Bazel 會將快取儲存在建構目錄中 (例如 out/default/bazel-*)。如果您清除建構目錄 (例如執行 fx clean-build 或 rm -rf out),這個快取就會遺失,而 Bazel 必須從頭重建所有項目。
您可以設定永久共用磁碟快取,即使建構目錄經過清理,快取仍會保留,且可供同一部電腦上的多個 Fuchsia 結帳和/或建構目錄共用。
共用磁碟快取的優點
加快清除建構作業:執行清除建構作業時,Bazel 可以從磁碟快取擷取先前建構的動作和構件,不必重新建構。
在結帳時共用:如果您在同一部電腦上使用多個 Fuchsia 結帳,這些結帳程序可以共用同一個磁碟快取。在一個結帳程序中建構的構件可重複用於另一個結帳程序,節省時間和磁碟空間。
在建構目錄之間共用:如果您在同一個結帳程序中切換不同的建構目錄,系統也會自動將快取用於兩者之間相同的動作 (包括輸入內容)。
跨分支共用:如果您經常在分支之間切換,同時使用相同的建構目錄,增量建構也會受益於磁碟快取。
遠端快取 (RBE) 的輔助功能:Bazel 的磁碟快取與遠端快取相容。即使啟用 Remote Build Execution (RBE),本機磁碟快取通常還是比較快,因為這樣在擷取快取構件時,可以避免網路延遲。您也可以離線處理已建構的目標。
啟用 Bazel 磁碟快取
如要啟用磁碟快取,請將 FUCHSIA_BAZEL_DISK_CACHE 環境變數設為要儲存快取的目錄絕對路徑。
舉例來說,在殼層開機指令碼 (例如 ~/.bashrc 或 ~/.zshrc) 中新增下列程式碼:
export FUCHSIA_BAZEL_DISK_CACHE="$HOME/.fuchsia_bazel_cache"
如果目錄不存在,建構系統會自動建立。
管理快取大小 (垃圾收集)
根據預設,磁碟快取會無限擴大。為避免耗用過多磁碟空間,您可以設定 FUCHSIA_BAZEL_DISK_CACHE_SIZE 環境變數,啟用自動垃圾回收功能。
這項變數會指定快取大小上限。Bazel 會在閒置時定期清理背景中較舊的快取項目,確保快取大小不超過這個限制。
在殼層開機指令碼中新增下列指令行,指定所需限制 (例如 40G 代表 40 GB):
export FUCHSIA_BAZEL_DISK_CACHE_SIZE="40G"
大小可以位元組為單位指定,也可以選擇性地加上 K、M、G 或 T。
如未設定 FUCHSIA_BAZEL_DISK_CACHE_SIZE,您必須手動管理快取大小 (例如在目錄過大時刪除目錄內容)。
避免大型構件的快取
快取不一定有益,舉例來說,對於會產生大型構件且經常變更的目標 (例如產品組裝),快取就沒有幫助。Bazel 提供多種方法,可避免快取這些構件。
如要定義個別目標,可以使用所有規則通用的tags 屬性。例如:
genrule(
name = "create_large_archive",
...
# No need to run this remotely, nor cache the archive.
tags = ["no-cache", "no-remote"],
)
如果是自訂規則,實作函式應叫用 ctx.actions.run(),並將 execution_requirements 屬性設為將標記字串對應至字串常值 "1" 的字典。請注意,使用 True 或整數 1 無效,這並未妥善記錄。
例如:
def _my_rule_impl(ctx):
...
ctx.actions.run(
...,
execution_requirements = {
"no-cache": "1",
"no-remote": "1",
},
)
...
my_rule = rule(
implementation = _my_rule_impl,
...
)
在這種情況下,所有 my_rule() 目標構件都會自動不快取 (或遠端)。