BUILD.bazel 檔案

總覽

Fuchsia 專案遵循官方 Bazel BUILD 樣式指南,但有少數例外。除了常見的 Bazel 樣式指南和最佳做法外,本頁也提供相關指引。

本頁面是 Bazel 樣式指南和最佳做法的一部分。

瀏覽權限

避免使用套件 default_visibility

建議您為必須在套件外部存取的每個目標指定瀏覽權限,而非宣告套件 default_visibility。一般來說,在目標定義中指定可見度時,BUILD.bazel 檔案會更容易瞭解。此外,使用 default_visibility 表示私有目標預設會具有某種程度的公開瀏覽權限。

只有在 BUILD.bazel 檔案中的每個目標 (無論是現在還是未來) 都應具有相同可見度時,才使用 default_visibility。這表示 BUILD.bazel 檔案中未定義私人輔助目標。舉例來說,如果定義了許多小工具,且這些小工具都必須對另一個套件 (目錄) 中的小工具載入器或小工具測試可見,就可能需要使用這個註解。

請勿將 default_visibility 用於 //visibility:public 和其他廣泛可見性,例如 //:__subpackages__ 或 //src:__subpackages__。

以 GN 術語來說,在 BUILD.bazel 檔案中使用 default_visibility = [...],等同於在 BUILD.gn 檔案頂端放置 visibility = [...]。無論是哪一種情況,您都必須為每個內部目標指定私人 visibility。

目標曝光度

總覽

在 Bazel 中:

  • 瀏覽權限是在套件 (目錄) 層級設定。無法將可見度限制為特定目標,無論是在相同套件還是其他套件中。

    • 如果需要,請考慮將目標重構為子目錄,以便分別參照。
  • 目標預設為套件私有,也就是說,同一套件 (BUILD.bazel 檔案) 中的其他目標可見。

    • 這相當於 visibility = [ ":__pkg__" ]。

    • 雖然可以擴大可見度 (請見下文),但無法防止同一套件 (BUILD.bazel 檔案) 中的其他目標使用。

    • 如果這是您要的結果,請考慮將其他目標重構至子目錄。

  • 必須指定目標 visibility,才能在定義目標的套件 (目錄) 外部存取目標。

如果你熟悉 GN
  • Bazel 目標預設為私有,而 GN 目標預設為公開。

    • BUILD.bazel 檔案中的預設瀏覽權限,等同於在每個 BUILD.gn 檔案頂端加上 visibility = [":*"]。
  • ...:__pkg__ 相當於 "...:*"

  • ...:__subpackages__ 相當於 ".../*"

  • 在 Bazel 中,目標一律對同一個套件 (目錄) 中的其他目標可見,且無法變更。

    • 在 GN 中,這相當於 visibility 一律包含 ":*"。

    • 在具有相互依附目標的 BUILD.bazel 檔案上使用 bazel2gn 時,即使 Bazel 不需要,您可能仍需在 BUILD.bazel 檔案中明確將 ":__pkg__", 新增至 visibility。

    • 新增這類項目時,請新增參照 bazel2gn 的註解,以便在移除 GN 目標時移除這些項目。

為每個目標設定適當的可見度

每個目標的 visibility 範圍應盡可能縮小。

請勿使用公開瀏覽權限 ("//visibility:public")。對於真正要在整個程式碼集中使用的常見目標,"//:__subpackages__" 是合適的字串。不過,建議您指定幾個頂層目錄 (例如 ["//sdk/lib:__subpackages__", "//src:__subpackages__"])。

視情況使用 __pkg__ 和 __subpackages__。

如要使用套件或私人瀏覽權限,請省略 visibility 屬性,因為這是預設值。

非明顯指定類型的可見度

config_setting() 和 exports_files() 支援瀏覽權限,與其他目標相同,但預設為公開。即使 Bazel 沒有要求,也請一律為這些項目指定 visibility。

target_compatible_with

主機目標

主機目標 (例如主機工具、主機測試和僅限主機的程式庫) 應指定 target_compatible_with = HOST_OS_CONSTRAINTS (從 //build/bazel/platforms:constraints.bzl 載入)。這會將相容性限制在與 CPU 架構無關的主機作業系統,讓開發人員能跨平台編譯工具,這也是 IDK 中的主機工具及其依附元件所必需。

除非在極少數情況下,否則建構團隊不應使用 @platforms//host:constraints.bzl 的 HOST_CONSTRAINTS。