Bazel ロックファイル

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

Bazel のロックファイル機能を使用すると、特定のバージョンや プロジェクトに必要なソフトウェア ライブラリまたはパッケージの依存関係。これは、 モジュールの解決と拡張の結果を保存し、 評価を行いますロックファイルは再現可能なビルドを促進し、一貫した 開発環境です。さらに、ビルドの効率を高めます。 Bazel は、解決プロセスの中で変更の影響を受けない部分をスキップします 必要があります。さらに、ロックファイルは 外部ライブラリの予期しない更新や互換性を破る変更を防止することで、 バグの発生リスクを軽減できます

ロックファイルの生成

ロックファイルはワークスペースのルートの下に MODULE.bazel.lock。ビルドプロセス中に作成または更新されるため、 特にモジュールの解決と拡張機能の評価の後に行われます。重要なのは 現在の呼び出しに含まれる依存関係だけを含む 構築できます。

プロジェクト内で依存関係に影響する変更が発生すると、ロックファイルは 自動的に更新され、新しい状態が反映されます。これにより、ロックファイルは 現在のインフラストラクチャに必要な特定の依存関係のセットに プロジェクトの解決済みのコンポーネントと 確認します。

ロックファイルの使用

ロックファイルはフラグで制御可能 --lockfile_mode~ プロジェクトの状態が Bazel とは異なる場合の Bazel の動作をカスタマイズできます 確認します。使用可能なモードは次のとおりです。

  • update(デフォルト): ロックファイルに存在する情報を使用して、 既知のレジストリファイルのダウンロードをスキップし、拡張機能の再評価を回避 その検索結果を最新の状態に維持できます情報が不足している場合は、 ロックファイルに追加します。このモードでは、Bazel はイメージの更新も回避し、 変更可能な情報(アンクされたバージョンなど)を、依存関係のない依存関係の 変更されました。
  • refresh: update と同様。ただし、変更可能な情報は、 自動的に切り替えられます。
  • error: update に似ていますが、情報が不足している場合や古い場合は、 Bazel がエラーで失敗します。このモードでは、ロックファイルまたは 解決中にネットワーク リクエストを実行します。次のマークが付いたモジュール拡張機能は reproducible は引き続きネットワーク リクエストを実行できますが、 常に同じ結果が得られると想定します
  • off: ロックファイルは確認も更新もされません。

ロックファイルのメリット

ロックファイルにはいくつかの利点があります。また、さまざまな方法で利用できます。

  • 再現可能なビルド。特定のバージョンまたは依存関係をキャプチャする ロックファイルにより、ビルドの再現性が確保されます。 経時的に変化し続ける可能性がありますデベロッパーは 一貫性があり予測可能な結果を 得ることができます

  • 迅速な解決。ロックファイルにより、Bazel による検出は 以前のビルドで使用されたレジストリファイルをダウンロードする これにより、特に次のようなシナリオで、ビルドの効率が大幅に向上します。 時間がかかります。

  • 安定性とリスクの軽減。ロックファイルは 外部ライブラリの予期しない更新や互換性を破る変更を防止できます。方法 特定のバージョンへの依存関係のロック、バグの発生リスク 互換性がない更新やテストされていない更新が原因で発生するエラーの数も減ります。

ロックファイルの内容

ロックファイルには、ロックされたファイルで プロジェクトの状態が変化しました。また、プロジェクトのビルド結果や 現在の状態に維持しますロックファイルは、次の 2 つの主要部分で構成されています。

  1. モジュール解決への入力であるすべてのリモート ファイルのハッシュ。
  2. 各モジュール拡張機能のロックファイルには、それに影響する入力が含まれています。 bzlTransitiveDigestusagesDigest、その他のフィールドで表され、 この拡張機能の実行の出力情報 generatedRepoSpecs

以下の例は、ロックファイルの構造と 説明があります。

{
  "lockFileVersion": 10,
  "registryFileHashes": {
    "https://bcr.bazel.build/bazel_registry.json": "8a28e4af...5d5b3497",
    "https://bcr.bazel.build/modules/foo/1.0/MODULE.bazel": "7cd0312e...5c96ace2",
    "https://bcr.bazel.build/modules/foo/2.0/MODULE.bazel": "70390338... 9fc57589",
    "https://bcr.bazel.build/modules/foo/2.0/source.json": "7e3a9adf...170d94ad",
    "https://registry.mycorp.com/modules/foo/1.0/MODULE.bazel": "not found",
    ...
  },
  "selectedYankedVersions": {
    "foo@2.0": "Yanked for demo purposes"
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "general": {
        "bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    },
    "//:extension.bzl%lockfile_ext2": {
      "os:macos": {
        "bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      },
      "os:linux": {
        "bzlTransitiveDigest": "eWDzxG/aLsyY3Ubrto....+Jp4maQvEPxn0pLK=",
        "usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    }
  }
}

レジストリファイルのハッシュ

registryFileHashes セクションには、 リモート レジストリへのアクセスを防止できます。解像度は、 入力が与えられ、リモートのすべてのリモート アプリが ハッシュされます。これにより、完全に再現可能な解決結果が得られながら、 ロックファイル内のリモート情報の過剰な重複を回避します。注: 特定のレジストリに特定のリソースが含まれていなかったときに、 優先順位の低いレジストリはそうでした( 例を参照)。この本質的に変更可能な情報は、 bazel mod deps --lockfile_mode=refresh

Bazel はロックファイルのハッシュを使用して、レジストリ ファイルが リポジトリ キャッシュをダウンロードできるため、以降の処理が 解決します。

選択された Yanked バージョン

selectedYankedVersions セクションには、アンクされたバージョンのモジュールが含まれる 自動的に選択されます。これは通常 エラーの原因となる ヤンクしたバージョンがビルドしようとしている場合にのみ、このセクションは空になりません。 --allow_yanked_versions または BZLMOD_ALLOW_YANKED_VERSIONS

このフィールドは、モジュール ファイルと比較して、バージョン情報をヤンクするために必要です。 本質的に可変であるため、ハッシュで参照することはできません。この情報は bazel mod deps --lockfile_mode=refresh で更新できます。

モジュール拡張機能

moduleExtensions セクションは、使用されている拡張機能のみを含むマップです。 現在の呼び出し内の、または以前に呼び出されたデータ(拡張機能は除く) 使用されなくなります。つまり拡張機能が使用されていない場合は 依存関係グラフ全体では、moduleExtensions から削除されます。 表示されます。

拡張機能がオペレーティング システムやアーキテクチャの種類に依存しない場合は、 このセクションで取り上げるのはあります。それ以外の場合は、 エントリが含められ、OS、アーキテクチャ、またはその両方に基づいて名前が付けられます。 それらの詳細項目で拡張機能を評価した結果に応じて対応します。

拡張マップの各エントリは、使用された拡張機能に対応し、 名前で識別されます。各値に対応する値 エントリには、その拡張機能に関連付けられている関連情報が含まれます。

  1. bzlTransitiveDigest は拡張機能実装のダイジェストです。 .bzl ファイルは推移的に読み込まれます。
  2. usagesDigest は、拡張機能の用途のダイジェストです。 すべてのタグを含む依存関係グラフ。
  3. 拡張機能への他の入力を追跡する、その他の未指定のフィールド クラウド・プロバイダーが読み取るファイルやディレクトリの コンテンツや環境など 使用します。
  4. generatedRepoSpecs は、作成したリポジトリをエンコードします。 現在の入力に置き換えます。
  5. オプションの moduleExtensionMetadata フィールドには、Google Cloud プロジェクトから 作成した特定のリポジトリを特定のリポジトリに ルート モジュールによって use_repo を介してインポートされる。この情報は bazel mod tidy コマンドを使用します。

モジュール拡張機能は、 reproducible = True でメタデータを返す。これにより、 同じ入力が与えられると、常に同じリポジトリが作成されます。

ベスト プラクティス

ロックファイル機能のメリットを最大化するには、次の点を考慮してください。 プラクティス:

  • 定期的にロックファイルを更新して、プロジェクトの依存関係の変更を反映する。 できます。これにより後続のビルドが 最新の正確な依存関係のセットを 提供しますすべての拡張機能をロックするには bazel mod deps --lockfile_mode=update を実行します。

  • ロックファイルをバージョン管理に含めることで、コラボレーションと すべてのチームメンバーが同じロックファイルにアクセスし、 プロジェクト全体で一貫した開発環境を使用できます。

  • bazelisk を使用して Bazel を実行し、 Bazel バージョンを指定するバージョン管理の .bazelversion ファイル ロックファイルに対応するファイルです。Bazel 自体は依存関係なので、 ロックファイルは Bazel バージョンに固有であり、 下位互換性を持つ Bazel リリース。bazelisk を使用すると、すべてのデベロッパーが ロックファイルと一致する Bazel バージョン。

以下のベスト プラクティスに従うことで、ロックファイルを効果的に利用できます。 の Bazel 機能。これにより、効率、信頼性、コラボレーション性が向上します。 ソフトウェア開発ワークフローに 最適です

結合の競合

ロックファイル形式はマージの競合を最小限に抑えるように設計されていますが、 できます。

自動解像度

Bazel では独自のカスタム ツールが git merge ドライバ 競合を自動的に解決できます

.gitattributes ファイルの git リポジトリにチェックを入れます。

# A custom merge driver for the Bazel lockfile.
# https://bazel.build/external/lockfile#automatic-resolution
MODULE.bazel.lock merge=bazel-lockfile-merge

その後、ドライバを使用する各開発者は、ドライバを 手順は次のとおりです。

  1. jq(1.5 以降)をインストールします。
  2. 次のコマンドを実行します。
jq_script=$(curl https://raw.githubusercontent.com/bazelbuild/bazel/master/scripts/bazel-lockfile-merge.jq)
printf '%s\n' "${jq_script}" | less # to optionally inspect the jq script
git config --global merge.bazel-lockfile-merge.name   "Merge driver for the Bazel lockfile (MODULE.bazel.lock)"
git config --global merge.bazel-lockfile-merge.driver "jq -s '${jq_script}' -- %O %A %B > %A.jq_tmp && mv %A.jq_tmp %A"

手動解像度

registryFileHashesselectedYankedVersions での単純なマージの競合 各フィールドの両側からのすべてのエントリを保持することで、 あります。

その他の種類のマージの競合は手動で解決しないでください。代替方法は次のとおりです。

  1. ロックファイルの以前の状態を復元する git reset MODULE.bazel.lock && git checkout MODULE.bazel.lock 経由。
  2. MODULE.bazel ファイルの競合を解決します。
  3. bazel mod deps を実行してロックファイルを更新します。