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(メインのMODULE.bazelファイルの横)このファイルが存在しない場合、エラーではありません。
--nohome_rcが存在しない限り、家 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.rcx.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 ステートメントの後に指定されたオプションは、インポートされたファイルのオプションよりも優先されます。
- 後でインポートされたファイルのオプションは、前にインポートされたファイルのオプションよりも優先されます。
オプションのデフォルト値
bazelrc のほとんどの行は、デフォルトのオプション値を定義します。各行の最初の単語は、これらのデフォルトが適用されるタイミングを指定します。
startup: 起動オプション。コマンドの前に配置し、bazel help startup_optionsで説明します。common: サポートされているすべての Bazel コマンドに適用するオプション。コマンドがこの方法で指定されたオプションをサポートしていない場合、そのオプションは、他の Bazel コマンドの一部で有効である限り無視されます。これはオプション名にのみ適用されます。現在のコマンドが指定された名前のオプションを受け入れても、指定された値をサポートしていない場合、コマンドは失敗します。always: すべての Bazel コマンドに適用されるオプション。コマンドがこの方法で指定されたオプションをサポートしていない場合、コマンドは失敗します。command: オプションが適用される Bazel コマンド(buildやqueryなど)。これらのオプションは、指定されたコマンドから継承するすべてのコマンドにも適用されます。(たとえば、testはbuildから継承します)。
これらの行はそれぞれ複数回使用できます。最初の単語の後に続く引数は、1 行に記述されている場合と同様に結合されます。(「スイスアーミーナイフ」コマンドライン インターフェースを備えた別のツールである 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で有効です。また、同じオプションのtest行がない限り、すべてのbuild行はbazel testにも適用されます。rc ファイルに次のように記載されている場合:test -c dbg --test_env=PATHbuild -c opt --verbose_failuresbazel 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から継承
- すべてのコマンドは
同じコマンドのオプションを同じ特定度で指定する 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 を設定しても無視されます。
--enable_platform_specific_config
.bazelrc のプラットフォーム固有の構成は、--enable_platform_specific_config を使用して自動的に有効にできます。たとえば、ホスト OS が Linux で build コマンドが実行されている場合、build:linux 構成が自動的に有効になります。サポートされている OS ID は 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 で無視するディレクトリを 1 行に 1 つずつ追加します。エントリはワークスペースのルートを基準としています。
グローバル 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 を無視するようにすることもできます。