Bazel では多くのオプションを使用できます。一部のオプション(たとえば、
--subcommands)は頻繁に変更されますが、他のオプション(たとえば、
--package_path)は複数のビルドで同じままです。ビルド
(およびその他のコマンド)ごとにこれらの変更されていないオプションを指定しないようにするには、
.bazelrcという構成ファイルでオプションを指定します。
.bazelrc ファイルの場所
Bazel は、次の場所でオプションの構成ファイルを検索します。
オプションはこの順序で解釈されるため、
競合が発生した場合は、後のファイルのオプションが前のファイルの値よりも優先されます。これらのファイルの読み込みを制御するオプションはすべて
スタートアップ オプションです。つまり、bazel の後、
コマンド(build、test など)の前に記述する必要があります。
--nosystem_rcが存在しない場合は、システム RC ファイル。パス:
- Linux/macOS/Unix の場合:
/etc/bazel.bazelrc - Windows の場合:
%ProgramData%\bazel.bazelrc
このファイルが存在しない場合でもエラーにはなりません。
システム指定の別の場所が必要な場合は、カスタム Bazel バイナリをビルドして、
BAZEL_SYSTEM_BAZELRC_PATH値を//src/main/cpp:option_processorでオーバーライドする必要があります。 システム指定の場所には、環境変数参照が含まれる場合があります。 たとえば、Unix の${VAR_NAME}や Windows の%VAR_NAME%などです。- Linux/macOS/Unix の場合:
ワークスペース RC ファイル。ただし、
--noworkspace_rcが存在する場合は除きます。パス: ワークスペース ディレクトリ(メインの
MODULE.bazelファイルの横)の.bazelrc。このファイルが存在しない場合でもエラーにはなりません。
ホーム RC ファイル。ただし、
--nohome_rcが存在する場合は除きます。パス:
- Linux/macOS/Unix の場合:
$HOME/.bazelrc - Windows の場合: 存在する場合は
%USERPROFILE%\.bazelrc、存在しない場合は%HOME%/.bazelrc
このファイルが存在しない場合でもエラーにはなりません。
- Linux/macOS/Unix の場合:
ユーザー指定の RC ファイル。
--bazelrc=fileで指定されている場合このフラグは省略可能ですが、複数回指定することもできます。
/dev/nullは、以降の--bazelrcがすべて無視されることを示します。これは 、リリース ビルドなどでユーザー RC ファイルの検索を無効にする場合に便利です。次に例を示します。
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rcx.rcとy.rcが読み取られます。z.rcは前の/dev/nullのため無視されます。
このオプションの構成ファイルに加えて、Bazel はグローバル RC ファイルを検索します。詳細については、グローバル bazelrc のセクションをご覧ください。
.bazelrc の構文とセマンティクス
すべての UNIX「rc」ファイルと同様に、.bazelrc ファイルは行ベースの
文法を持つテキスト ファイルです。空の行と # で始まる行(コメント)は無視されます。各行には一連の単語が含まれており、Bourne シェルと同じ
ルールに従ってトークン化されます。
インポート
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から継承します)。
これらの各行は複数回使用でき、
最初の単語に続く引数は、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_failuresthen
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から継承します。
- すべてのコマンドは
同じコマンドのオプションを同じ具体性で指定する 2 つの行は、ファイル内での出現順に 解析されます。
この優先順位ルールはファイルの順序と一致しないため、RC ファイル内で優先順位に従うと 読みやすくなります。つまり、先頭に
commonオプションを記述し、ファイルの末尾に最も具体的なコマンドを 記述します。このようにすると、オプションが読み取られる順序と適用される順序が 同じになるため、より直感的になります。
RC ファイルの行で指定された引数には、ビルド ターゲットの名前など、オプションでは ない引数が含まれる場合があります。これらは、同じファイルで指定された オプションと同様に、コマンドラインの兄弟 よりも優先順位が低く、常にオプション以外の引数の明示的なリストの先頭に追加されます。
--config
RC ファイルは、オプションのデフォルトを設定するだけでなく、オプションをグループ化して、一般的なグループのショートカットを提供するためにも使用できます。これを行うには、コマンドに :name
接尾辞を追加します。これらのオプションはデフォルトでは無視されますが、オプション --config=name が存在する場合は、コマンドラインまたは .bazelrc ファイルに存在する場合でも、別の構成定義内であっても、再帰的に含まれます。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 識別子は、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 ファイル。$workspace/tools/bazel.rcにあるワークスペース RC ファイル。$HOME/.bazelrcにあるホーム RC ファイル。
ここに記載されている各 bazelrc ファイルには、無効にするために使用できる対応するフラグ(--nosystem_rc、--noworkspace_rc、--nohome_rc など)があります。
また、--ignore_all_rc_files
スタートアップ オプションを渡すことで、Bazel にすべての bazelrc を無視させることもできます。