Bazel は多くのオプションを受け入れます。頻繁に異なるオプション(--subcommands
など)もあれば、複数のビルドで同じオプション(--package_path
など)もあります。これらの変更されていないオプションをすべてのビルド(およびその他のコマンド)に指定しないようにするには、.bazelrc
という構成ファイルでオプションを指定します。
.bazelrc
ファイルはどこにありますか?
Bazel は、次の場所でオプションの構成ファイルを下記の順序で検索します。オプションはこの順序で解釈されるため、競合が発生した場合、後続のファイルのオプションで前のファイルの値をオーバーライドできます。これらのファイルの読み込みを制御するオプションはすべて起動オプションです。つまり、bazel
の後にコマンド(build
、test
など)の前に指定する必要があります。
--nosystem_rc
が存在しない限り、システム RC ファイル。パス:
- Linux/macOS/Unix の場合:
/etc/bazel.bazelrc
- Windows の場合:
%ProgramData%\bazel.bazelrc
このファイルが存在しない場合、エラーではありません。
システムで指定された別の場所が必要な場合は、
//src/main/cpp:option_processor
のBAZEL_SYSTEM_BAZELRC_PATH
値をオーバーライドして、カスタム Bazel バイナリをビルドする必要があります。システムで指定されたロケーションには、Unix の${VAR_NAME}
や Windows の%VAR_NAME%
などの環境変数参照が含まれている場合があります。- Linux/macOS/Unix の場合:
--noworkspace_rc
が存在しない限り、ワークスペース RC ファイル。パス: ワークスペース ディレクトリの
.bazelrc
(メインのWORKSPACE
ファイルの隣)。このファイルが存在しない場合、エラーは発生しません。
ホーム RC ファイル(
--nohome_rc
が存在しない場合)。パス:
- Linux / macOS / Unix の場合:
$HOME/.bazelrc
- Windows の場合:
%USERPROFILE%\.bazelrc
(存在する場合)または%HOME%/.bazelrc
このファイルが存在しなくてもエラーにはなりません。
- Linux / macOS / Unix の場合:
--bazelrc=file
で指定されている場合のユーザー指定の RC ファイルこのフラグは省略可能ですが、複数回指定することもできます。
/dev/null
は、それ以降のすべての--bazelrc
が無視されることを示します。これは、リリースビルドなどでユーザー 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 シェルと同じルールに従ってトークン化されます。
インポート
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
から継承します)。
これらの行はそれぞれ複数回使用できます。最初の単語に続く引数は、1 行に記述されている場合と同様に結合されます。(「Swiss Army Knife」というコマンドライン インターフェースを備えたツールである CVS では、.cvsrc
の構文に似た構文が表示されます)。たとえば、次のようになります。
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
に対して有効です。同じオプションにtest
行がない限り、すべてのbuild
行がbazel 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
から継承されます。 test
、run
、clean
、mobile-install
、info
、print_action
、config
、cquery
、aquery
のコマンドはbuild
から継承されており、より限定的です。coverage
はtest
から継承します。
- すべてのコマンドは
同じコマンドのオプションを同じ特定度で指定する 2 つの行は、ファイル内に表示される順序で解析されます。
この優先順位ルールはファイルの順序と一致しないため、rc ファイル内の優先順位に従うと読みやすくなります。先頭に
common
オプションを配置し、ファイルの末尾に最も詳細なコマンドを記載します。これにより、オプションの読み取り順序が適用順序と同じになり、より直感的になります。
rc ファイルの行で指定された引数には、ビルド ターゲットの名前など、オプションではない引数を含めることができます。これらは、同じファイルで指定されたオプションと同様に、コマンドラインでの兄弟要素よりも優先順位が低く、オプション以外の引数の明示的なリストは常に先頭に付加されます。
--config
rc ファイルを使用すると、オプションのデフォルトを設定するだけでなく、オプションをグループ化し、一般的なグループ化の短縮形として使用できます。これを行うには、コマンドに :name
接尾辞を追加します。これらのオプションはデフォルトでは無視されますが、コマンドラインまたは .bazelrc
ファイルに --config=name
オプションが存在する場合は、別の構成定義内でも再帰的に含まれます。command:name
で指定されたオプションは、上記の優先順位で、該当するコマンドに対してのみ展開されます。
--config=foo
は、rc ファイル「インプレース」で定義されたオプションに展開されるため、構成に指定されたオプションの優先順位は --config=foo
オプションと同じになります。
この構文は、startup
を使用して起動オプションを設定する場合には適用されません。.bazelrc で startup:config-name --some_startup_option
を設定しても無視されます。
例
以下に、~/.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 で無視するディレクトリを 1 行に 1 つずつ追加します。エントリはワークスペースのルートを基準としています。
グローバル bazelrc ファイル
Bazel は、オプションの bazelrc ファイルを次の順序で読み取ります。
- etc/bazel.bazelrc
にあるシステム rc ファイル。- $workspace/tools/bazel.rc
にあるワークスペースの rc ファイル。- $HOME/.bazelrc
にあるホームの rc ファイル
ここに示す各 bazelrc ファイルには、無効化に使用できる対応するフラグ(--nosystem_rc
、--noworkspace_rc
、--nohome_rc
など)があります。--ignore_all_rc_files
起動オプションを渡すことで、Bazel のすべての bazelrc を無視することもできます。