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
,这对于在发布 build 中停用用户 rc 文件的搜索非常有用。例如:
--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
的文件不会。
导入优先级:
- 导入文件中的选项优先于在 import 语句之前指定的选项。
- 在 import 语句后指定的选项优先于导入文件中的选项。
- 稍后导入的文件中的选项优先于之前导入的文件中的选项。
选项默认值
bazelrc 的大多数行都定义了默认选项值。每行的第一个字词指定了应用这些默认值的时间:
startup
:启动选项,位于命令之前,在bazel help startup_options
中进行了说明。common
:应应用于支持这些选项的所有 Bazel 命令的选项。如果某个命令不支持以这种方式指定的选项,只要该选项对某些其他 Bazel 命令有效,系统就会忽略该选项。 请注意,这仅适用于选项名称:如果当前命令接受具有指定名称的选项,但不支持指定的值,则会失败。always
:适用于所有 Bazel 命令的选项。如果命令不支持以这种方式指定的选项,则会失败。command
:Bazel 命令,例如build
或query
,选项将应用于该命令。这些选项还适用于从指定命令继承的所有命令。(例如,test
继承自build
。)
这些行中的每一行都可以多次使用,并且第一个字词后面的实参会合并在一起,就像它们出现在同一行中一样。(CVS 用户会发现,.cvsrc
的语法与 CVS 类似,CVS 是另一款具有“瑞士军刀”命令行界面的工具。)例如,以下行:
build --test_tmpdir=/tmp/foo --verbose_failures
build --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=PATH
build -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 文件:
- 位于
etc/bazel.bazelrc
的系统 rc 文件。 - 工作区 rc 文件位于
$workspace/tools/bazel.rc
。 - 位于
$HOME/.bazelrc
的主 rc 文件
此处列出的每个 bazelrc 文件都有一个对应的标志,可用于停用这些文件(例如 --nosystem_rc
、--noworkspace_rc
、--nohome_rc
)。您还可以通过传递 --ignore_all_rc_files
启动选项,使 Bazel 忽略所有 bazelrc 文件。