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

問題を報告する ソースを表示 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

  1. システム RC ファイル--nosystem_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. ワークスペース RC ファイル--noworkspace_rc が存在する場合を除く)。

    パス: ワークスペース ディレクトリの .bazelrc(メインの MODULE.bazel ファイルの隣)。

    このファイルが存在しない場合でもエラーにはなりません。

  3. ホーム RC ファイル--nohome_rc が存在する場合を除く)。

    パス:

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

    このファイルが存在しない場合でもエラーにはなりません。

  4. ユーザーが指定した RC ファイル--bazelrc=file で指定した場合)

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

    /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 されたファイルの場合は失敗しないことです。

インポートの優先順位:

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

オプションのデフォルト値

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 から継承されます
    • 次のコマンドは build から継承されます(build よりも具体的です)。testruncleanmobile-installinfoprint_actionconfigcqueryaquery
    • coveragefetchvendortest から継承されます
  • 同じコマンドのオプションを同じ特異性で指定する 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 は linuxmacoswindowsfreebsdopenbsd です。このフラグを有効にすることは、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 ファイルを次の順序で読み取ります。

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

ここに記載されている各 bazelrc ファイルには、それらを無効にするために使用できる対応するフラグ(--nosystem_rc--noworkspace_rc--nohome_rc など)があります。--ignore_all_rc_files スタートアップ オプションを渡すことで、Bazel にすべての bazelrc を無視させることもできます。