ベンダーモードは 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~
2 人とも 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.bazel ファイルで制御できます。 ダウンロードします。
使用できるディレクティブは 2 つあります。どちらも、 正規リポジトリ名を引数として指定:
ignore()
: ベンダーモードからリポジトリを完全に無視します。pin()
: リポジトリが存在するかのように、現在のベンダリングされたソースにリポジトリを固定します。 このリポジトリの--override_repository
フラグ。Bazel は、ベンダリングされた ベンダー コマンドを実行する際にこのリポジトリのソースを指定します。 ユーザーは、このリポジトリのベンダリングされたソースを手動で変更、管理できます。
次に例を示します。
ignore("@@rules_cc~")
pin("@@bazel_skylib~")
この構成では
- どちらのリポジトリも、後続のベンダー コマンドから除外されます。
- Repo
bazel_skylib
は、 vendor ディレクトリにあります。 - ユーザーは、ベンダリングされた
bazel_skylib
のソースを安全に変更できます。 bazel_skylib
を再ベンダするには、ユーザーが PIN ステートメントを無効にする必要があります。 見てみましょう。
ベンダーモードの仕組みを理解する
Bazel は、$(bazel info
output_base)/external
にあるプロジェクトの外部依存関係を取得します。外部依存関係のベンダリングとは、
関連するファイルとディレクトリを特定の vendor ディレクトリに配置し、
今後のビルド用にベンダリングされたソース。
ベンダリングされるコンテンツには以下が含まれます。
- リポジトリ ディレクトリ
- リポジトリ マーカー ファイル
ビルド中に、ベンダリングされたマーカー ファイルが最新であるか、リポジトリが
VENDOR.bazel ファイルに固定されている場合、Bazel はベンダリングされたソースを使用し、
実際にではなく、$(bazel info output_base)/external
の下にあるそれへのシンボリック リンク。
リポジトリ ルールを実行します。それ以外の場合は、警告が出力され、Bazel は以下の処理を実行します。
最新バージョンのリポジトリをフェッチします
ベンダー レジストリ ファイル
Bazel は、外部を取得するために Bazel モジュールの解決を実行する必要がある
レジストリ ファイルにインターネット経由でアクセスする必要がある場合があります。宛先
Bazel ベンダーは、すべてのレジストリ ファイルをオフライン ビルドで取得し、
<vendor_dir>/_registries
ディレクトリの下にあります。
ベンダー シンボリック リンク
外部リポジトリには、他のファイルを指すシンボリック リンクが含まれている場合があります。 ディレクトリを作成します。シンボリック リンクが正しく機能するように、Bazel は次のものを使用します。 ベンダリングされたソースのシンボリック リンクを書き換える戦略:
$(bazel info output_base)/external
を指すシンボリック リンク<vendor_dir>/bazel-external
を作成します。Bazel コマンドごとに更新される 自動的に適用されます。- ベンダリングされたソースに対して、最初に参照しているシンボリック リンクをすべて書き換えます。
$(bazel info output_base)/external
の下の相対パス<vendor_dir>/bazel-external
。
たとえば、元のシンボリック リンクが
<vendor_dir>/repo_foo~/link => $(bazel info output_base)/external/repo_bar~/file
次の新しいルールに書き換えられます:
<vendor_dir>/repo_foo~/link => ../../bazel-external/repo_bar~/file
ここで
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
<vendor_dir>/bazel-external
は Bazel によって自動的に生成されるため、
チェックインしないように、.gitignore
または同等の要素に追加することをおすすめします。
この方法では、ベンダリングされたソース内のシンボリック リンクは、 ベンダリングされたソースが別の場所または bazel 出力ベースに移動した後 変更されます。