本页面假定您熟悉 Bazel,并提供有关如何构建项目以充分利用 Bazel 功能的指南和 建议。
总体目标是:
- 使用细粒度依赖项,以实现并行性和增量性。
- 保持依赖项的良好封装。
- 使代码结构良好且可测试。
- 创建易于理解和维护的构建配置。
这些指南并非要求:很少有项目能够遵守 所有指南。正如 lint 的手册页所说:“第一个使用严格检查生成没有错误的真实程序的人将获得特别奖励。”但是,尽可能多地融入这些原则应该会使项目更易读、更不容易出错,并且构建速度更快。
本页面使用此 RFC中描述的要求级别。
运行构建和测试
项目应始终能够在稳定分支上成功运行 bazel build //... 和
bazel test //...。在某些情况下(例如,需要特定的构建
标志、无法在特定平台上构建、需要许可协议)需要但无法构建的目标应尽可能具体地标记(例如,“requires-osx”)。这种
标记允许以比
“手动”标记更精细的级别过滤目标,并允许检查 BUILD 文件的人员了解目标的限制。
第三方依赖项
您可以声明第三方依赖项:
- 要么在
MODULE.bazel文件中将它们声明为远程代码库。 - 要么将它们放在工作区目录下的名为
third_party/的目录中。
依赖于二进制文件
应尽可能从源代码构建所有内容。一般来说,这意味着您需要创建一个
BUILD文件并从其源代码构建some-library.so,而不是依赖于库some-library.so,然后依赖于该
目标。
始终从源代码构建可确保构建不会使用使用不兼容的标志或不同架构构建的库。还有一些功能(例如覆盖率、静态分析或动态分析)仅适用于源代码。
版本控制
尽可能从 head 构建所有代码。如果必须使用版本,请避免在目标名称中包含版本(例如,//guava而不是 //guava-20.0)。这种命名方式使库更易于更新(只需更新一个目标)。它对菱形依赖项
问题也更具弹性:如果一个库依赖于 guava-19.0,而另一个库依赖于 guava-20.0,
您最终可能会得到一个尝试依赖于两个不同版本的库。
如果您创建了一个误导性别名,将两个目标都指向一个 guava 库,
那么 BUILD 文件就会具有误导性。
使用 .bazelrc 文件
对于特定于项目的选项,请使用您的
workspace/.bazelrc配置文件(请参阅bazelrc 格式)。
如果您想为项目支持您不想 签入源代码控制系统的用户专用选项,请添加以下行:
try-import %workspace%/user.bazelrc
(或任何其他文件名)到 workspace/.bazelrc
中,并将 user.bazelrc 添加到 .gitignore 中。
软件包
每个包含可构建文件的目录都应是一个软件包。如果 BUILD
文件引用子目录中的文件(例如,srcs = ["a/b/C.java"]),则表示应将 BUILD 文件添加到该子目录中。这种结构存在的时间越长,就越有可能无意中创建循环依赖项,目标的范围会扩大,并且必须更新的反向依赖项数量也会增加。