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