ベンダーモード

ベンダーモードは、外部依存関係のローカルコピーを作成できる Bzlmod の機能です。これは、オフライン ビルドや、外部依存関係のソースを制御する場合に便利です。

ベンダーモードを有効にする

ベンダーモードを有効にするには、--vendor_dir フラグを指定します。

たとえば、.bazelrc ファイルに追加します。

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

vendor ディレクトリは、ワークスペースのルートへの相対パスまたは絶対パスのいずれかです。

特定の外部リポジトリをベンダリングする

--repo フラグを指定して vendor コマンドを使用すると、ベンダーにどのリポジトリを配布するかを指定できます。このコマンドでは、正規リポジトリ名見かけのリポジトリ名の両方を指定できます。

たとえば、次のコマンドを実行します。

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

または

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~

rules_cc は両方とも <workspace root>/vendor_src/rules_cc~ でベンダリングされます。

指定されたターゲットに対するベンダー外部依存関係

特定のターゲット パターンのビルドに必要なすべての外部依存関係をベンダリングするには、bazel vendor <target patterns> を実行します。

次に例を示します。

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

//src/main:hello-world ターゲットのビルドに必要なすべてのリポジトリと、//src/test/... の下にあるすべてのターゲットを現在の構成でベンダリングします。

内部的には、bazel build --nobuild コマンドが実行されてターゲット パターンが分析されるため、このコマンドにビルドフラグを適用して結果に影響を与える可能性があります。

ターゲットをオフラインでビルドする

外部依存関係をベンダリングしたら、次の方法でターゲットをオフラインでビルドできます。

bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...

ビルドは、ネットワーク アクセスとリポジトリ キャッシュのないクリーンなビルド環境で動作する必要があります。

したがって、ベンダリングされたソースをチェックインして、別のマシンで同じターゲットをオフラインでビルドできるはずです。

すべての外部依存関係をベンダリングする

推移的外部依存関係グラフ内のすべてのリポジトリをベンダするには、次のコマンドを実行します。

bazel vendor --vendor_dir=vendor_src

すべての依存関係をベンダリングすることには、いくつかのデメリットがあります。

  • 推移的に導入されたリポジトリを含むすべてのリポジトリの取得には時間がかかる場合があります。
  • vendor ディレクトリは非常に大きくなる可能性があります。
  • 現在のプラットフォームや環境と互換性がない場合、一部のリポジトリは取得に失敗することがあります。

そのため、まず特定のターゲットに対するベンダリングを検討してください。

VENDOR.bazel でベンダーモードを構成する

vendor ディレクトリにある VENDOR.bazel ファイルで、指定したリポジトリの処理方法を制御できます。

使用できるディレクティブは 2 つあります。どちらも、引数として正規リポジトリ名のリストを受け取ります。

  • ignore(): ベンダーモードからリポジトリを完全に無視します。
  • pin(): このリポジトリに --override_repository フラグがある場合と同様に、現在のベンダリングされたソースにリポジトリを固定します。Bazel は、固定を解除しない限り、vendor コマンドを実行している間、このリポジトリのベンダリングされたソースを更新しません。ユーザーは、このリポジトリのベンダリングされたソースを手動で変更、管理できます。

次に例を示します。

ignore("@@rules_cc~")
pin("@@bazel_skylib~")

この構成では

  • どちらのリポジトリも、後続のベンダー コマンドから除外されます。
  • Repo bazel_skylib は、vendor ディレクトリにあるソースにオーバーライドされます。
  • ユーザーは、ベンダリングされた bazel_skylib のソースを安全に変更できます。
  • bazel_skylib を再ベンダするには、まず PIN ステートメントを無効にする必要があります。

ベンダーモードの仕組みを理解する

Bazel は、$(bazel info output_base)/external にあるプロジェクトの外部依存関係を取得します。外部依存関係のベンダリングとは、関連するファイルやディレクトリを特定のベンダー ディレクトリに移動し、ベンダリングされたソースを後のビルドに使用することを意味します。

ベンダリングされるコンテンツには以下が含まれます。

  • リポジトリ ディレクトリ
  • リポジトリ マーカー ファイル

ビルド中に、ベンダリングされたマーカー ファイルが最新であるか、リポジトリが VENDOR.bazel ファイルに固定されている場合、Bazel は実際にリポジトリ ルールを実行する代わりに、$(bazel info output_base)/external の下にベンダリングされたソースへのシンボリック リンクを作成して、ベンダリングされたソースを使用します。それ以外の場合は、警告が出力され、Bazel はフォールバックして最新バージョンのリポジトリを取得します。