總覽
下列樣式和最佳做法適用於 Fuchsia 中的所有 Bazel 檔案。
本頁是 Bazel 樣式指南和最佳做法的一部分,其中包含特定情境的額外指引。
來源檔案和依附元件清單的本機變數
雖然官方指南不建議使用依附元件變數,但 Fuchsia 允許使用這類變數,以便管理大型共用來源檔案或依附元件清單。請考慮清單是否實質相似,或只是共用幾個常見項目。
不扣除:絕不從清單變數中移除項目。
瀏覽權限
以下是一般準則,適用於 BUILD.bazel 和 .bzl 檔案。如需更具體的詳細資料,請參閱各項目的頁面。
請盡可能在 BUILD.bazel 和 .bzl 檔案中指定可見度
只有在巨集屬於套件 (目錄) 私有巨集時,才不需要指定屬性。
請勿使用公開瀏覽權限
請勿在 bazel_sdk/ 目錄外使用公開瀏覽權限 ("//visibility:public" 或 visibility("public"))。只有在外部存放區使用程式碼時,才適合採用這個存取層級,但這不適用於 fuchsia.git 中的非 SDK 程式碼。
瀏覽權限應盡可能縮小範圍,同時允許測試和反向依附元件存取
可見度應僅限於需要和/或應允許使用該項目的目標。保守但實用。舉例來說,如果目標是在 //src 的五個直接子目錄中使用,請考慮使用 //src:__subpackages__,以免新增用途時需要修改可見度。不過,舉例來說,如果目標只應由驅動程式使用,請將其限制為實作驅動程式的套件。
針對常見的非簡單瀏覽權限定義,使用套件群組
如果多個目標的 visibility 應限制為同一組標籤,請考慮以 package_group 代表該組標籤。與目標搭配使用時,package_group 也支援負可視度,但與載入可視度搭配使用時則不支援。
請勿混用 SDK 和平台符號及目標
平台目標 (即 AIB 或 IDK 中的所有內容) 不得使用 Fuchsia Bazel SDK 中定義的符號、其提供的目標,或使用其建構的目標。
反之亦然,使用 Fuchsia Bazel SDK 建構的目標不應依附於平台目標,也不應從平台 .bzl 檔案載入符號。
請勿使用 Fuchsia Bazel SDK 路徑
平台程式碼絕不應存取包含 bazel_sdk 或 Fuchsia Bazel SDK 存放區路徑的檔案路徑,例如:
@fuchsia_sdk//@internal_sdk//@rules_fuchsia//fuchsia
唯一允許的路徑開頭為 @fuchsia_rules_common/,但只有 Build 團隊應直接使用這些路徑。
平台程式碼也應避免使用 bazel_sdk/ 路徑,但與 Fuchsia Bazel SDK 共用實作的特定建構規則除外。
目標和 .bzl 檔案的標籤
參考目標
如要參照目標 (例如在 deps 中),只要不使用禁止的標籤模式,即可使用以下開頭的標籤:
:- 僅對同一套件 (
BUILD.bazel檔案) 中的目標使用相對標籤。
- 僅對同一套件 (
//- 如需例外狀況,請參閱「請勿使用 Fuchsia Bazel SDK 路徑」。
@platforms//
從 .bzl 檔案載入
Fuchsia 平台的大部分一般用途巨集和規則都位於 //build/bazel/rules/ 中。
只要不使用禁止的標籤模式,即可安全地從標籤開頭為下列字元的 .bzl 檔案中load():
:- 請只對同一套件 (目錄) 中的檔案使用相對標籤。
//- 如需例外狀況,請參閱「請勿使用 Fuchsia Bazel SDK 路徑」。
@bazel_skylib//
以下項目也允許使用,但只有建構團隊的開發人員可能會用到:
@fuchsia_build_config//:defs.bzl@fuchsia_build_info//:args.bzl@fuchsia_rules_common//
禁止的標籤模式
請勿使用 [SHAC error]:
Workspace 根套件標籤 (以
//:開頭的標籤)- 在非常特殊且罕見的情況下,才需要這麼做 (請參閱問題 560343570),但一般來說,這項操作應只由建構團隊執行。
套件名稱中含有斜線 (
/) 的標籤,也就是冒號 (:) 後方的標籤部分。- 整合第三方程式庫的例外情況很少。
fuchsia_... 檔案和符號位於 Fuchsia Bazel SDK 中
請避免定義名稱開頭為 fuchsia_ 的檔案、巨集和規則。
以 fuchsia_ 開頭的現有名稱例項可能屬於 Fuchsia Bazel SDK (請參閱「請勿使用 Fuchsia Bazel SDK 路徑」),避免使用這類名稱有助於維持該分隔。
如需區分 Fuchsia 平台與一般 Bazel ID 時使用的模式,請參閱「包裝內建和常見規則、巨集和函式」。
使用 Fuchsia 專屬包裝函式
如果存在 Fuchsia 專屬包裝函式,請使用這些函式,而非外部存放區、巨集等。這有助於確保 Fuchsia 建構設定會一致套用。
具體來說,下列語言有包裝函式:
C/C++:請使用
//build/bazel/rules/cc/...中的fx_cc_...(),而非@rules_cc//中的cc_...。Rust:請使用
//build/bazel/rules/rust/...中的rustc_...(),而非@rules_rust//中的rust_...。
Fuchsia 沒有下列語言的包裝函式。如要確保一致性,請從下列路徑載入:
前往:
@io_bazel_rules_go//go...Python:
@rules_python//python...
字串
字串請使用雙引號,但請避免逸出
根據預設,字串會使用雙引號。不過,如果列印雙引號更合適,且這麼做會涉及逸出雙引號 (\"),請使用單引號來避免逸出。