Bazel のロックファイル機能を使用すると、特定のバージョンや プロジェクトに必要なソフトウェア ライブラリまたはパッケージの依存関係。これは、 モジュールの解決と拡張の結果を保存し、 評価を行いますロックファイルは再現可能なビルドを促進し、一貫した 開発環境です。さらに、ビルドの効率を高めます。 プロジェクトに変更がない場合に Bazel が解決プロセスをスキップ 確認します。さらに、ロックファイルは安定性の向上を目的として、 予期せぬ更新や互換性を破る変更が行われる可能性があるため、 バグが発生する可能性があります。
ロックファイルの生成
ロックファイルはワークスペースのルートの下に
MODULE.bazel.lock
。ビルドプロセス中に作成または更新されるため、
特にモジュールの解決と拡張機能の評価の後に行われます。ロックファイル
は、モジュール ファイル、フラグ、環境変数など、
その他の関連情報を確認できます。重要なのは、
含まれています。
プロジェクト内で依存関係に影響する変更が発生すると、ロックファイルは 自動的に更新され、新しい状態が反映されます。これにより、ロックファイルは 現在のインフラストラクチャに必要な特定の依存関係のセットに プロジェクトの解決済みのコンポーネントと 確認します。
ロックファイルの使用
ロックファイルはフラグで制御可能
--lockfile_mode
~
プロジェクトの状態が Bazel とは異なる場合の Bazel の動作をカスタマイズできます
確認します。使用可能なモードは次のとおりです。
update
(デフォルト): プロジェクトの状態がロックファイルと一致する場合、 解決結果がすぐにロックファイルから返されます。それ以外の場合は ロックファイルが更新され、最新のバージョンを あります。error
: プロジェクトの状態がロックファイルと一致する場合、解決結果は次のようになります。 ロックファイルから返されます。それ以外の場合、Bazel はエラーをスローし、 ロックファイル間の変更を簡単に特定できます。このモードは特に プロジェクトの依存関係を維持したいときに便利です。 変更されず、差異はすべてエラーとして扱われます。off
: ロックファイルはまったくチェックされません。
ロックファイルのメリット
ロックファイルにはいくつかの利点があります。また、さまざまな方法で利用できます。
再現可能なビルド。特定のバージョンまたは依存関係をキャプチャする ロックファイルにより、ビルドの再現性が確保されます。 経時的に変化し続ける可能性がありますデベロッパーは 一貫性があり予測可能な結果を 得ることができます
効率的な解決策のスキップ。ロックファイルにより、Bazel は プロジェクトの依存関係に変更がなく 確認できます。これにより、ビルドの効率が大幅に向上します。特に、 解決に時間がかかることがあるシナリオです。
安定性とリスクの軽減。ロックファイルは 外部ライブラリの予期しない更新や互換性を破る変更を防止できます。方法 特定のバージョンへの依存関係のロック、バグの発生リスク 互換性がない更新やテストされていない更新が原因で発生するエラーの数も減ります。
ロックファイルの内容
ロックファイルには、ロックされたファイルで 示されます。また、プロジェクトのビルド結果や 現在の状態に維持しますロックファイルは、次の 2 つの主要部分で構成されています。
- モジュール解像度の入力(
moduleFileHash
、flags
、など)localOverrideHashes
および解像度の出力(moduleDepGraph
。 - 各モジュール拡張機能のロックファイルには、それに影響する入力が含まれています。
transitiveDigest
で表される拡張機能の実行の出力。generatedRepoSpecs
として参照する
以下の例は、ロックファイルの構造と 説明があります。
{
"lockFileVersion": 1,
"moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
"flags": {
"cmdRegistries": [
"https://bcr.bazel.build/"
],
"cmdModuleOverrides": {},
"allowedYankedVersions": [],
"envVarAllowedYankedVersions": "",
"ignoreDevDependency": false,
"directDependenciesMode": "WARNING",
"compatibilityMode": "ERROR"
},
"localOverrideHashes": {
"bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
},
"moduleDepGraph": {
"<root>": {
"name": "",
"version": "",
"executionPlatformsToRegister": [],
"toolchainsToRegister": [],
"extensionUsages": [
{
"extensionBzlFile": "extension.bzl",
"extensionName": "lockfile_ext"
}
],
...
}
},
"moduleExtensions": {
"//:extension.bzl%lockfile_ext": {
"transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
}
}
}
モジュール・ファイル・ハッシュ
moduleFileHash
は、MODULE.bazel
ファイル コンテンツのハッシュを表します。条件
ハッシュ値は異なります。
フラグ
Flags
オブジェクトには、解決結果に影響を与える可能性のあるすべてのフラグが格納されます。
ローカル オーバーライド ハッシュ
ルート モジュールに local_path_overrides
が含まれている場合、このセクションにはハッシュ
(ローカル リポジトリの MODULE.bazel
ファイル)。変更を追跡できる
この依存関係に追加します。
モジュールの依存関係グラフ
moduleDepGraph
は、次を使用して解決プロセスの結果を表します。
必要があります。すべてのモジュールの依存関係グラフを形成し、
プロジェクトの実行に必要な権限のみを
提供します
モジュール拡張機能
moduleExtensions
セクションは、使用されている拡張機能のみを含むマップです。
現在の呼び出し内の、または以前に呼び出されたデータ(拡張機能は除く)
使用されなくなります。つまり拡張機能が使用されていない場合は
依存関係グラフ全体では、moduleExtensions
から削除されます。
表示されます。
このマップの各エントリは、使用された拡張機能に対応し、 ファイルと名前を含むファイルです。各エントリに対応する値には、 次のような情報が表示されます。
transitiveDigest
: 拡張機能実装のダイジェストとその 一時的な .bzl ファイル。generatedRepoSpecs
は、この拡張機能の実行結果です。 現在の入力。
拡張機能の結果に影響を与える可能性のある追加の要因は、その使用状況です。 ロックファイルには保存されませんが、比較時に使用状況が考慮されます。 拡張機能の現在の状態をロックファイル内の拡張機能と同期します。
ベスト プラクティス
ロックファイル機能のメリットを最大化するには、次の点を考慮してください。 プラクティス:
定期的にロックファイルを更新して、プロジェクトの依存関係の変更を反映する。 できます。これにより、以降のビルドが 最新の正確な依存関係のセットを 提供します
バージョン管理にロックファイルを含めて、コラボレーションや すべてのチームメンバーが同じロックファイルにアクセスし、 プロジェクト全体で一貫した開発環境を使用できます。
以下のベスト プラクティスに従うことで、ロックファイルを効果的に利用できます。 の Bazel 機能。これにより、効率、信頼性、コラボレーション性が向上します。 ソフトウェア開発ワークフローに 最適です