ベンダーモード

<ph type="x-smartling-placeholder"></ph> 問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

ベンダーモードは Bzlmod の機能の一つで、 外部依存関係があります。これは、オフライン ビルドの場合や、ビルド ロジックを 外部依存関係のソースを制御します。

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

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

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

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

vendor ディレクトリは、ワークスペースのルートへの相対パスか、 指定します。

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

--repo フラグを指定して vendor コマンドを使用すると、どのリポジトリを指定できますか? 正規リポジトリと正規リポジトリの両方を受け入れ nameApparent リポジトリ できます。

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

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 出力ベースに移動した後 変更されます。