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。