Bazel 接受许多选项。有些选项会经常变化(例如 --subcommands),而有些选项在多个 build 中保持不变(例如 --package_path)。为避免为每个 build(以及其他命令)指定这些不变的选项,您可以在名为 .bazelrc 的配置文件中指定选项。
.bazelrc 文件在哪里?
Bazel 会按照下方所示的顺序在以下位置查找可选配置文件。系统会按此顺序解读选项,因此如果出现冲突,后续文件中的选项可以替换之前文件中的值。用于控制要加载哪些文件的所有选项都是启动选项,这意味着这些选项必须位于 bazel 之后且在命令(build、test 等)之前。
系统 RC 文件,除非存在
--nosystem_rc。路径:
- 在 Linux/macOS/Unix 上:
/etc/bazel.bazelrc - 在 Windows 上:
%ProgramData%\bazel.bazelrc
如果此文件不存在,则不算错误。
如果需要其他系统指定的位置,您必须构建自定义 Bazel 二进制文件,替换
//src/main/cpp:option_processor中的BAZEL_SYSTEM_BAZELRC_PATH值。系统指定的位置可能包含环境变量引用,例如在 Unix 上为${VAR_NAME},在 Windows 上为%VAR_NAME%。- 在 Linux/macOS/Unix 上:
工作区 RC 文件,除非存在
--noworkspace_rc。路径:工作区目录中的
.bazelrc(位于主要MODULE.bazel文件旁边)。如果此文件不存在,则不算错误。
主 RC 文件,除非存在
--nohome_rc。路径:
- 在 Linux/macOS/Unix 上:
$HOME/.bazelrc - 在 Windows 上:
%USERPROFILE%\.bazelrc(如果存在)或%HOME%/.bazelrc
如果此文件不存在,则不算错误。
- 在 Linux/macOS/Unix 上:
用户指定的 RC 文件(如果使用
--bazelrc=file指定)此标志是可选的,但也可以多次指定。
/dev/null表示系统会忽略所有其他--bazelrc,这对于停用用户 rc 文件的搜索非常有用,例如在发布 build 中。例如:
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc- 读取
x.rc和y.rc。 - 由于先前的
/dev/null,系统会忽略z.rc。
- 读取
除了此可选配置文件之外,Bazel 还会查找全局 rc 文件。如需了解详情,请参阅全局 bazelrc 部分。
.bazelrc 语法和语义
与所有 UNIX“rc”文件一样,.bazelrc 文件是一种采用基于行的语法的文本文件。空行和以 #(注释)开头的行将被忽略。每行包含一系列字词,这些字词会根据与 Bourne shell 相同的规则进行分词。
导入
以 import 或 try-import 开头的行是特殊行:可用于加载其他“rc”文件。如需指定相对于工作区根目录的路径,请写入 import %workspace%/path/to/bazelrc。
import 和 try-import 之间的区别在于,如果缺少 import 编译的文件(或无法读取),Bazel 会失败,但对于 try-import 编译的文件,则不会。
导入优先级:
- 导入的文件中的选项优先于在导入语句之前指定的选项。
- 在导入语句后指定的选项优先于导入文件中的选项。
- 后续导入的文件中的选项优先于先前导入的文件中的选项。
选项默认值
bazelrc 的大多数行都定义了默认选项值。每行中的第一个字词指定了何时应用这些默认值:
startup:启动选项,位于命令之前,并在bazel help startup_options中进行了说明。common:应应用于支持它们的所有 Bazel 命令的选项。如果某个命令不支持以这种方式指定的选项,则系统会忽略该选项,前提是该选项对某些其他 Bazel 命令有效。请注意,这仅适用于选项名称:如果当前命令接受具有指定名称的选项,但不支持指定的值,则会失败。always:适用于所有 Bazel 命令的选项。如果某个命令不支持以这种方式指定的选项,则会失败。command:适用于选项的 Bazel 命令,例如build或query。这些选项也适用于从指定命令继承的所有命令。(例如,test继承自build。)
这些行中的每行都可以重复使用,并且第一个字词后面的参数会合并,就像它们出现在同一行中一样。(CVS 的用户会发现,该工具的命令行界面类似于“瑞士军刀”,其语法也与 .cvsrc 类似。)例如以下行:
build --test_tmpdir=/tmp/foo --verbose_failuresbuild --test_tmpdir=/tmp/bar
组合为:
build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar因此,有效标志为 --verbose_failures 和 --test_tmpdir=/tmp/bar。
选项优先级:
- 命令行上的选项始终优先于 rc 文件中的选项。例如,如果 rc 文件中显示
build -c opt,但命令行标志为-c dbg,则命令行标志优先。 在 rc 文件中,优先级由具体性决定:更具体的命令对应的行优先于不太具体的命令对应的行。
具体性由继承定义。某些命令会继承其他命令的选项,这会使继承命令比基本命令更具体。例如,
test继承自build命令,因此所有bazel build标志都适用于bazel test,并且所有build行也适用于bazel test,除非针对同一选项存在test行。如果 rc 文件显示以下内容:test -c dbg --test_env=PATHbuild -c opt --verbose_failures则
bazel build //foo将使用-c opt --verbose_failures,bazel test //foo将使用--verbose_failures -c dbg --test_env=PATH。继承(专用性)图如下所示:
- 每个命令都继承自
common - 以下命令继承自
build(并且比build更具体):test、run、clean、mobile-install、info、print_action、config、cquery和aquery coverage、fetch和vendor继承自test
- 每个命令都继承自
如果有两行代码分别指定了同一个命令的选项,并且它们的指定方式具有相同的具体性,则系统会按照它们在文件中显示的顺序解析这两行代码。
由于此优先级规则与文件顺序不一致,因此如果您遵循 rc 文件中的优先级顺序(从顶部的
common选项开始,到文件底部的最具体命令结束),有助于提高可读性。这样,读取选项的顺序与应用选项的顺序相同,更直观。
rc 文件中某行指定的参数可能包括并非选项的参数,例如 build 目标的名称等。与在同一文件中指定的选项一样,这些选项的优先级低于命令行上的同级选项,并且始终附加到非选项参数的显式列表的开头。
--config
除了设置选项默认值之外,rc 文件还可用于对选项进行分组,并为常见分组提供简写形式。为此,您可以向命令添加 :name 后缀。默认情况下,系统会忽略这些选项,但如果命令行或 .bazelrc 文件中存在 --config=name 选项,系统会递归地添加这些选项,即使在其他配置定义内也是如此。command:name 指定的选项仅会针对适用的命令展开,并遵循上述优先顺序。
--config=foo 会“原地”扩展为 rc 文件中定义的选项,以便为配置指定的选项具有与 --config=foo 选项相同的优先级。
此语法不适用于使用 startup 设置启动选项。系统会忽略在 .bazelrc 中设置 startup:config-name --some_startup_option。
--enable_platform_specific_config
您可以使用 --enable_platform_specific_config 自动启用 .bazelrc 中的平台专用配置。例如,如果主机操作系统为 Linux 且运行了 build 命令,系统会自动启用 build:linux 配置。支持的操作系统标识符包括 linux、macos、windows、freebsd 和 openbsd。启用此标志相当于在 Linux 上使用 --config=linux、在 Windows 上使用 --config=windows 等。
请参阅 --enable_platform_specific_config。
示例
以下是一个示例 ~/.bazelrc 文件:
# Bob's Bazel option defaults
startup --host_jvm_args=-XX:-UseParallelGC
import /home/bobs_project/bazelrc
build --show_timestamps --keep_going --jobs 600
build --color=yes
query --keep_going
# Definition of --config=memcheck
build:memcheck --strip=never --test_timeout=3600
用于管理 Bazel 行为的其他文件
.bazelignore
您可以指定工作区中要让 Bazel 忽略的目录,例如使用其他构建系统的相关项目。将名为 .bazelignore 的文件放在工作区的根目录下,然后添加要让 Bazel 忽略的目录(每行一个)。条目相对于工作区根目录。
全局 bazelrc 文件
Bazel 会按以下顺序读取可选的 bazelrc 文件:
- 系统 rc 文件位于
etc/bazel.bazelrc。 - 工作区 rc 文件位于
$workspace/tools/bazel.rc。 - 位于
$HOME/.bazelrc的主 rc 文件
此处列出的每个 bazelrc 文件都有一个对应的标志,可用于停用它们(例如 --nosystem_rc、--noworkspace_rc、--nohome_rc)。您还可以通过传递 --ignore_all_rc_files 启动选项,让 Bazel 忽略所有 bazelrc。