總覽
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。