概览
以下样式和最佳实践适用于 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 共享实现的特定 build 规则。
目标和 .bzl 文件的标签
引用目标
在引用目标(例如在 deps 中)时,只要不使用禁止的标签模式,便允许使用以以下任意字符开头的标签:
:- 仅对同一软件包(
BUILD.bazel文件)中的目标使用相对标签。
- 仅对同一软件包(
//- 如需了解例外情况,请参阅不使用 Fuchsia Bazel SDK 路径。
@platforms//
从 .bzl 文件加载
Fuchsia 平台的大多数通用宏和规则都可以在 //build/bazel/rules/ 中找到。
只要不使用禁止的标签模式,就可以安全地从标签以以下内容开头的 .bzl 文件中 load():
:- 仅对同一软件包(目录)中的文件使用相对标签。
//- 如需了解例外情况,请参阅不使用 Fuchsia Bazel SDK 路径。
@bazel_skylib//
以下内容也允许使用,但只有 Build 团队的开发者可能会使用:
@fuchsia_build_config//:defs.bzl@fuchsia_build_info//:args.bzl@fuchsia_rules_common//
禁止的标签格式
请勿使用 [SHAC 错误]:
Workspace 根软件包标签(以
//:开头的标签)- 在非常特殊且极少见的情况下,需要这样做(请参阅问题 560343570),但一般情况下,只有 build 团队才应这样做。
在软件包名称(即冒号 [
:] 后面的标签部分)中包含斜杠 (/) 的标签。- 在极少数情况下,可以集成第三方库。
fuchsia_… 文件和符号位于 Fuchsia Bazel SDK 中
避免定义名称以 fuchsia_ 开头的文件、宏和规则。以 fuchsia_ 开头的现有实例名称可能属于 Fuchsia Bazel SDK(请参阅请勿使用 Fuchsia Bazel SDK 路径),避免使用此类名称有助于保持这种分离。
如需了解在需要区分 Fuchsia 平台与常规 Bazel 标识符时使用的一种模式,请参阅封装内置规则、常见规则、宏和函数。
使用特定于 Fuchsia 的封装容器
如果存在特定于 Fuchsia 的封装容器,请使用这些封装容器,而不是外部代码库、宏等。这有助于确保 Fuchsia build 配置得到一致应用。
具体来说,有以下语言的封装容器:
C/C++:使用
//build/bazel/rules/cc/...中的fx_cc_...(),而不是@rules_cc//中的cc_...。Rust:使用
//build/bazel/rules/rust/...中的rustc_...(),而不是@rules_rust//中的rust_...。
Fuchsia 没有以下语言的封装容器。从以下路径加载,以保持一致性:
Go:
@io_bazel_rules_go//go...Python:
@rules_python//python...
字符串
使用双引号表示字符串,但为了避免转义
默认情况下,使用双引号表示字符串。不过,如果打印双引号更合适,但这样做需要对双引号进行转义 (\"),请使用单引号以避免转义。