bazelrc 構成ファイルを書き込む

問題を報告 ソースを表示 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel は多くのオプションを受け入れます。オプションには、頻繁に変更されるもの(--subcommands など)と、複数のビルドで同じままのもの(--package_path など)があります。ビルドごとに(および他のコマンドでも)これらの変更されないオプションを指定する必要がないように、.bazelrc という構成ファイルでオプションを指定できます。

.bazelrc ファイルはどこにありますか?

Bazel は、次の場所でオプションの構成ファイルを下記の順序で検索します。オプションはこの順序で解釈されるため、競合が発生した場合、後続のファイルのオプションで前のファイルの値をオーバーライドできます。これらのファイルの読み込みを制御するオプションはすべて起動オプションです。つまり、bazel の後にコマンド(buildtest など)の前に指定する必要があります。

  1. --nosystem_rc が存在しない限り、システム RC ファイル

    パス:

    • Linux / macOS / Unix の場合: /etc/bazel.bazelrc
    • Windows の場合: %ProgramData%\bazel.bazelrc

    このファイルが存在しない場合、エラーは発生しません。

    システムで指定された別の場所が必要な場合は、//src/main/cpp:option_processorBAZEL_SYSTEM_BAZELRC_PATH 値をオーバーライドして、カスタム Bazel バイナリをビルドする必要があります。システムで指定されたロケーションには、Unix の ${VAR_NAME} や Windows の %VAR_NAME% などの環境変数参照が含まれている場合があります。

  2. --noworkspace_rc が存在しない限り、ワークスペース RC ファイル

    パス: ワークスペース ディレクトリの .bazelrc(メインの WORKSPACE ファイルの横)

    このファイルが存在しなくてもエラーにはなりません。

  3. --nohome_rc が存在しない限り、家 RC ファイル

    パス:

    • Linux / macOS / Unix の場合: $HOME/.bazelrc
    • Windows の場合: %USERPROFILE%\.bazelrc(存在する場合)または %HOME%/.bazelrc

    このファイルが存在しない場合、エラーは発生しません。

  4. --bazelrc=file で指定されている場合のユーザー指定の RC ファイル

    このフラグは省略可能ですが、複数回指定することもできます。

    /dev/null は、以降の --bazelrc がすべて無視されることを示します。これは、リリースビルドなどでユーザー rc ファイルの検索を無効にする場合に便利です。

    例:

    --bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
    
    • x.rcy.rc が読み取られます。
    • 先行する /dev/null があるため、z.rc は無視されます。

このオプションの構成ファイルに加えて、Bazel はグローバル rc ファイルを探します。詳細については、グローバル bazelrc セクションをご覧ください。

.bazelrc の構文とセマンティクス

すべての UNIX の「rc」ファイルと同様に、.bazelrc ファイルは行ベースの文法を持つテキスト ファイルです。空の行と # で始まる行(コメント)は無視されます。各行には、Bourne シェルと同じルールに従ってトークン化された一連の単語が含まれます。

インポート

import または try-import で始まる行は特別な行です。これらの行を使用して、他の「rc」ファイルを読み込みます。ワークスペースのルートからの相対パスを指定するには、import %workspace%/path/to/bazelrc と記述します。

importtry-import の違いは、import されたファイルがない(または読み取れない)場合は Bazel が失敗するのに対し、try-import されたファイルでは失敗しない点です。

インポートの優先順位:

  • インポートされたファイル内のオプションは、import ステートメントの前に指定されたオプションよりも優先されます。
  • import ステートメントの後に指定されたオプションは、インポートされたファイル内のオプションよりも優先されます。
  • 後でインポートされたファイルのオプションは、前にインポートされたファイルのオプションよりも優先されます。

オプションのデフォルト

bazelrc のほとんどの行では、デフォルトのオプション値が定義されています。各行の最初の単語は、これらのデフォルトが適用されるタイミングを指定します。

  • startup: 起動オプション。コマンドの前に配置し、bazel help startup_options で説明します。
  • common: サポートするすべての Bazel コマンドに適用する必要があるオプション。コマンドがこの方法で指定されたオプションをサポートしていない場合、そのオプションは、他の Bazel コマンドの一部で有効である限り無視されます。これはオプション名にのみ適用されます。現在のコマンドが、指定された名前のオプションを受け入れても、指定された値がサポートされていない場合、そのコマンドは失敗します。
  • always: すべての Bazel コマンドに適用されるオプション。コマンドがこの方法で指定されたオプションをサポートしていない場合、コマンドは失敗します。
  • command: オプションが適用される Bazel コマンド(buildquery など)。これらのオプションは、指定されたコマンドから継承するすべてのコマンドにも適用されます。(たとえば、testbuild から継承します)。

これらの行はそれぞれ複数回使用できます。最初の単語に続く引数は、1 行に記述されている場合と同様に結合されます。(「スイスアーミーナイフ」コマンドライン インターフェースを備えた別のツールである 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 ファイル内での優先順位は、特定度によって決まります。より具体的なコマンドの行は、より具体的でないコマンドの行よりも優先されます。

    特異性は継承によって定義されます。一部のコマンドは他のコマンドからオプションを継承し、継承コマンドはベースコマンドよりも特定のものです。たとえば、testbuild コマンドから継承するため、すべての 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 から継承します。
    • testruncleanmobile-installinfoprint_actionconfigcqueryaquery のコマンドは build から継承されており、より限定的です。
    • coveragetest から継承します
  • 同じコマンドのオプションを同じ特定度で指定する 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 ファイルを読み取ります。

  1. etc/bazel.bazelrc にあるシステム rc ファイル。
  2. $workspace/tools/bazel.rc にあるワークスペースの rc ファイル。
  3. $HOME/.bazelrc にあるホーム rc ファイル

ここにリストされている各 bazelrc ファイルには、無効にするために使用できる対応するフラグがあります(例: --nosystem_rc--noworkspace_rc--nohome_rc)。--ignore_all_rc_files 起動オプションを渡すことで、Bazel がすべての bazelrc を無視するようにすることもできます。