WORKSPACE の欠点により、Bzlmod は以前の WORKSPACE システムに代わるものです。WORKSPACE ファイルは Bazel 8(2024 年後半)ですでに無効になっており、Bazel 9(2025 年後半)で削除されます。このガイドでは、プロジェクトを Bzlmod に移行し、外部依存関係の管理に WORKSPACE を使用しないようにする方法について説明します。
Bzlmod に移行する理由
従来の WORKSPACE システムと比較して多くの利点があり、Bazel エコシステムの健全な成長を確保するのに役立ちます。
プロジェクトが他のプロジェクトの依存関係である場合、Bzlmod に移行すると、他のプロジェクトの移行がブロックされなくなり、プロジェクトへの依存が容易になります。
Bzlmod への移行は、将来の Bazel バージョンを使用するために必要な手順です(Bazel 9 では必須)。
Bzlmod に移行する方法
推奨される移行プロセス:
- 移行ツールをヘルパー ツールとして使用し、移行プロセスを可能な限り効率化します。
- 移行ツールを使用してもエラーが残っている場合は、手動で解決します。
WORKSPACEファイルとMODULE.bazelファイル内のコンセプトの主な違いについては、WORKSPACE と Bzlmod のセクションをご覧ください。
WORKSPACE と Bzlmod の比較
Bazel の WORKSPACE と Bzlmod は、構文は異なりますが同様の機能を提供します。このセクションでは、特定の WORKSPACE 機能から Bzlmod に移行する方法について説明します。
Bazel ワークスペースのルートを定義する
WORKSPACE ファイルは Bazel プロジェクトのソースルートをマークします。この役割は、Bazel バージョン 6.3 以降では MODULE.bazel に置き換えられています。Bazel バージョン 6.3 より前のバージョンでは、ワークスペースのルートに WORKSPACE ファイルまたは WORKSPACE.bazel ファイルがまだ存在しているはずです。次のようなコメントが含まれている可能性があります。
Google Workspace
# This file marks the root of the Bazel workspace. # See MODULE.bazel for external dependencies setup.
bazelrc で Bzlmod を有効にする
.bazelrc を使用すると、Bazel を実行するたびに適用されるフラグを設定できます。Bzlmod を有効にするには、--enable_bzlmod フラグを使用して common コマンドに適用し、すべてのコマンドに適用されるようにします。
.bazelrc
# Enable Bzlmod for every Bazel command common --enable_bzlmod
ワークスペースのリポジトリ名を指定する
Google Workspace
workspace関数は、ワークスペースのリポジトリ名を指定するために使用されます。これにより、ワークスペース内のターゲット//foo:barを@<workspace name>//foo:barとして参照できます。指定しない場合、ワークスペースのデフォルトのリポジトリ名は__main__です。## WORKSPACE workspace(name = "com_foo_bar")Bzlmod
@<repo name>を使用せずに//foo:bar構文を使用して、同じワークスペース内のターゲットを参照することをおすすめします。ただし、古い構文が必要な場合は、module関数で指定されたモジュール名をリポジトリ名として使用できます。モジュール名が必要なリポジトリ名と異なる場合は、module関数のrepo_name属性を使用してリポジトリ名をオーバーライドできます。## MODULE.bazel module( name = "bar", repo_name = "com_foo_bar", )
外部依存関係を Bazel モジュールとして取得する
依存関係が Bazel プロジェクトの場合、Bzlmod も採用していれば、Bazel モジュールとして依存関係を持つことができます。
Google Workspace
WORKSPACE では、
http_archiveまたはgit_repositoryリポジトリ ルールを使用して Bazel プロジェクトのソースをダウンロードするのが一般的です。## WORKSPACE load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "bazel_skylib", urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz"], sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa", ) load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() http_archive( name = "rules_java", urls = ["https://github.com/bazelbuild/rules_java/releases/download/6.1.1/rules_java-6.1.1.tar.gz"], sha256 = "76402a50ae6859d50bd7aed8c1b8ef09dae5c1035bb3ca7d276f7f3ce659818a", ) load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") rules_java_dependencies() rules_java_toolchains()ご覧のとおり、ユーザーが依存関係のマクロから推移的依存関係を読み込む必要があるのは一般的なパターンです。
bazel_skylibとrules_javaの両方がplatformに依存していると仮定します。platform依存関係の正確なバージョンは、マクロの順序によって決まります。Bzlmod
Bzlmod では、依存関係が Bazel Central Registry またはカスタム Bazel レジストリで使用可能であれば、
bazel_depディレクティブを使用して簡単に依存関係を設定できます。## MODULE.bazel bazel_dep(name = "bazel_skylib", version = "1.4.2") bazel_dep(name = "rules_java", version = "6.1.1")Bzlmod は、MVS アルゴリズムを使用して Bazel モジュールの依存関係を推移的に解決します。そのため、
platformの最大必要バージョンが自動的に選択されます。
依存関係を Bazel モジュールとしてオーバーライドする
ルートモジュールとして、さまざまな方法で Bazel モジュールの依存関係をオーバーライドできます。
詳しくは、オーバーライドのセクションをご覧ください。
使用例は、examples リポジトリで確認できます。
モジュール拡張機能を使用して外部依存関係をフェッチする
依存関係が Bazel プロジェクトでない場合や、Bazel レジストリでまだ利用できない場合は、use_repo_rule またはモジュール拡張機能を使用して導入できます。
Google Workspace
http_fileリポジトリ ルールを使用してファイルをダウンロードします。## WORKSPACE load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") http_file( name = "data_file", url = "http://example.com/file", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", )Bzlmod
Bzlmod では、MODULE.bazel ファイルで
use_repo_ruleディレクティブを使用して、リポジトリを直接インスタンス化できます。## MODULE.bazel http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") http_file( name = "data_file", url = "http://example.com/file", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", )内部的には、これはモジュール拡張機能を使用して実装されています。リポジトリ ルールを呼び出すだけでなく、より複雑なロジックを実行する必要がある場合は、モジュール拡張機能を自分で実装することもできます。定義を
.bzlファイルに移動する必要があります。これにより、移行期間中に WORKSPACE と Bzlmod 間で定義を共有することもできます。## repositories.bzl load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") def my_data_dependency(): http_file( name = "data_file", url = "http://example.com/file", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", )モジュール拡張機能を実装して、依存関係マクロを読み込みます。マクロの同じ
.bzlファイルで定義できますが、古い Bazel バージョンとの互換性を維持するため、別の.bzlファイルで定義することをおすすめします。## extensions.bzl load("//:repositories.bzl", "my_data_dependency") def _non_module_dependencies_impl(_ctx): my_data_dependency() non_module_dependencies = module_extension( implementation = _non_module_dependencies_impl, )リポジトリをルート プロジェクトから見えるようにするには、MODULE.bazel ファイルでモジュール拡張機能とリポジトリの使用状況を宣言する必要があります。
## MODULE.bazel non_module_dependencies = use_extension("//:extensions.bzl", "non_module_dependencies") use_repo(non_module_dependencies, "data_file")
モジュール拡張機能を使用して外部依存関係の競合を解決する
プロジェクトは、呼び出し元からの入力に基づいて外部リポジトリを導入するマクロを提供できます。依存関係グラフに複数の呼び出し元があり、競合が発生した場合はどうなるでしょうか。
プロジェクト foo が、version を引数として取る次のマクロを提供するとします。
## repositories.bzl in foo {:#repositories.bzl-foo}
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
def data_deps(version = "1.0"):
http_file(
name = "data_file",
url = "http://example.com/file-%s" % version,
# Omitting the "sha256" attribute for simplicity
)
Google Workspace
WORKSPACE を使用すると、
@fooからマクロを読み込み、必要なデータ依存関係のバージョンを指定できます。別の依存関係@barがあり、これも@fooに依存しているが、データの依存関係の異なるバージョンを必要としているとします。## WORKSPACE # Introduce @foo and @bar. ... load("@foo//:repositories.bzl", "data_deps") data_deps(version = "2.0") load("@bar//:repositories.bzl", "bar_deps") bar_deps() # -> which calls data_deps(version = "3.0")この場合、エンドユーザーは WORKSPACE のマクロの順序を慎重に調整して、必要なバージョンを取得する必要があります。これは、依存関係を解決する適切な方法が提供されていないため、WORKSPACE の最大の難点の 1 つです。
Bzlmod
Bzlmod を使用すると、プロジェクト
fooの作成者はモジュール拡張機能を使用して競合を解決できます。たとえば、すべての Bazel モジュール間でデータ依存関係の最大バージョンを常に選択することが妥当であるとします。## extensions.bzl in foo load("//:repositories.bzl", "data_deps") data = tag_class(attrs={"version": attr.string()}) def _data_deps_extension_impl(module_ctx): # Select the maximal required version in the dependency graph. version = "1.0" for mod in module_ctx.modules: for data in mod.tags.data: version = max(version, data.version) data_deps(version) data_deps_extension = module_extension( implementation = _data_deps_extension_impl, tag_classes = {"data": data}, )## MODULE.bazel in bar bazel_dep(name = "foo", version = "1.0") foo_data_deps = use_extension("@foo//:extensions.bzl", "data_deps_extension") foo_data_deps.data(version = "3.0") use_repo(foo_data_deps, "data_file")## MODULE.bazel in root module bazel_dep(name = "foo", version = "1.0") bazel_dep(name = "bar", version = "1.0") foo_data_deps = use_extension("@foo//:extensions.bzl", "data_deps_extension") foo_data_deps.data(version = "2.0") use_repo(foo_data_deps, "data_file")この場合、ルート モジュールはデータ バージョン
2.0を必要とし、依存関係barは3.0を必要とします。fooのモジュール拡張機能は、この競合を正しく解決し、データ依存関係にバージョン3.0を自動的に選択できます。
サードパーティのパッケージ マネージャーを統合する
最後のセクションで説明したように、モジュール拡張機能は依存関係グラフから情報を収集し、依存関係を解決するカスタム ロジックを実行して、リポジトリ ルールを呼び出して外部リポジトリを導入する方法を提供します。これにより、ルール作成者は特定の言語のパッケージ マネージャーを統合するルールセットを強化できます。
モジュール拡張機能の使用方法について詳しくは、モジュール拡張機能のページをご覧ください。
Bzlmod を採用してさまざまなパッケージ マネージャーから依存関係を取得しているルールセットのリストは次のとおりです。
疑似パッケージ マネージャーを統合する最小限の例は、examples リポジトリで入手できます。
ホストマシン上のツールチェーンを検出する
Bazel ビルドルールでホストマシンで使用可能なツールチェーンを検出する必要がある場合、リポジトリルールを使用してホストマシンを検査し、ツールチェーン情報を外部リポジトリとして生成します。
Google Workspace
シェル ツールチェーンを検出する次のリポジトリルールがあるとします。
## local_config_sh.bzl def _sh_config_rule_impl(repository_ctx): sh_path = get_sh_path_from_env("SH_BIN_PATH") if not sh_path: sh_path = detect_sh_from_path() if not sh_path: sh_path = "/shell/binary/not/found" repository_ctx.file("BUILD", """ load("@bazel_tools//tools/sh:sh_toolchain.bzl", "sh_toolchain") sh_toolchain( name = "local_sh", path = "{sh_path}", visibility = ["//visibility:public"], ) toolchain( name = "local_sh_toolchain", toolchain = ":local_sh", toolchain_type = "@bazel_tools//tools/sh:toolchain_type", ) """.format(sh_path = sh_path)) sh_config_rule = repository_rule( environ = ["SH_BIN_PATH"], local = True, implementation = _sh_config_rule_impl, )リポジトリルールは WORKSPACE に読み込むことができます。
## WORKSPACE load("//:local_config_sh.bzl", "sh_config_rule") sh_config_rule(name = "local_config_sh")Bzlmod
Bzlmod では、モジュール拡張機能を使用して同じリポジトリを導入できます。これは、前のセクションで
@data_fileリポジトリを導入するのと同様です。## local_config_sh_extension.bzl load("//:local_config_sh.bzl", "sh_config_rule") sh_config_extension = module_extension( implementation = lambda ctx: sh_config_rule(name = "local_config_sh"), )次に、MODULE.bazel ファイルで拡張機能を使用します。
## MODULE.bazel sh_config_ext = use_extension("//:local_config_sh_extension.bzl", "sh_config_extension") use_repo(sh_config_ext, "local_config_sh")
ツールチェーンと実行プラットフォームを登録する
前のセクションに続いて、リポジトリ ホスティング ツールチェーン情報(local_config_sh など)を導入したら、ツールチェーンを登録することをおすすめします。
Google Workspace
WORKSPACE を使用すると、次の方法でツールチェーンを登録できます。
ツールチェーンを
.bzlファイルに登録し、WORKSPACE ファイルでマクロを読み込むことができます。## local_config_sh.bzl def sh_configure(): sh_config_rule(name = "local_config_sh") native.register_toolchains("@local_config_sh//:local_sh_toolchain")## WORKSPACE load("//:local_config_sh.bzl", "sh_configure") sh_configure()または、WORKSPACE ファイルにツールチェーンを直接登録します。
## WORKSPACE load("//:local_config_sh.bzl", "sh_config_rule") sh_config_rule(name = "local_config_sh") register_toolchains("@local_config_sh//:local_sh_toolchain")
Bzlmod
Bzlmod では、
register_toolchainsAPI とregister_execution_platformsAPI は MODULE.bazel ファイルでのみ使用できます。モジュール拡張機能でnative.register_toolchainsを呼び出すことはできません。## MODULE.bazel sh_config_ext = use_extension("//:local_config_sh_extension.bzl", "sh_config_extension") use_repo(sh_config_ext, "local_config_sh") register_toolchains("@local_config_sh//:local_sh_toolchain")
WORKSPACE、WORKSPACE.bzlmod、各 Bazel モジュールの MODULE.bazel ファイルに登録されているツールチェーンと実行プラットフォームは、ツールチェーンの選択時に次の優先順位に従います(高い順)。
- ルート モジュールの
MODULE.bazelファイルに登録されているツールチェーンと実行プラットフォーム。 WORKSPACEファイルまたはWORKSPACE.bzlmodファイルに登録されているツールチェーンと実行プラットフォーム。- ルート モジュールの(推移的)依存関係であるモジュールによって登録されたツールチェーンと実行プラットフォーム。
WORKSPACE.bzlmodを使用しない場合:WORKSPACE接尾辞に登録されたツールチェーン。
ローカル リポジトリの概要
デバッグ用に依存関係のローカル バージョンが必要な場合や、ワークスペース内のディレクトリを外部リポジトリとして組み込む場合は、依存関係をローカル リポジトリとして導入する必要があります。
Google Workspace
WORKSPACE では、
local_repositoryとnew_local_repositoryの 2 つのネイティブ リポジトリ ルールでこれを実現します。## WORKSPACE local_repository( name = "rules_java", path = "/Users/bazel_user/workspace/rules_java", )Bzlmod
Bzlmod では、
local_path_overrideを使用して、ローカルパスでモジュールをオーバーライドできます。## MODULE.bazel bazel_dep(name = "rules_java") local_path_override( module_name = "rules_java", path = "/Users/bazel_user/workspace/rules_java", )モジュール拡張機能を使用してローカル リポジトリを導入することもできます。ただし、モジュール拡張機能で
native.local_repositoryを呼び出すことはできません。すべてのネイティブ リポジトリ ルールを Starlark 化する作業が進行中です(進捗状況については #18285 をご覧ください)。その後、モジュール拡張機能で対応する starlarklocal_repositoryを呼び出すことができます。これがブロックの問題である場合は、local_repositoryリポジトリ ルールのカスタム バージョンを簡単に実装することもできます。
バインド ターゲット
WORKSPACE の bind ルールは非推奨であり、Bzlmod ではサポートされていません。これは、特別な //external パッケージでターゲットにエイリアスを付与するために導入されました。これに依存しているすべてのユーザーは移行する必要があります。
たとえば チェックアウトマイクロサービスを呼び出す
## WORKSPACE
bind(
name = "openssl",
actual = "@my-ssl//src:openssl-lib",
)
これにより、他のターゲットが //external:openssl に依存できるようになります。この問題を回避するには、次の方法で移行できます。
//external:opensslの使用箇所をすべて@my-ssl//src:openssl-libに置き換えます。- ヒント:
bazel query --output=build --noenable_bzlmod --enable_workspace [target]コマンドを使用して、ターゲットに関する関連情報を確認します。
- ヒント:
または、
aliasビルドルールを使用します。パッケージ(
//third_partyなど)で次のターゲットを定義します。## third_party/BUILD alias( name = "openssl", actual = "@my-ssl//src:openssl-lib", )//external:opensslの使用箇所をすべて//third_party:opensslに置き換えます。
フェッチと同期
fetch コマンドと sync コマンドは、外部リポジトリをローカルにダウンロードして最新の状態に保つために使用されます。また、ビルドに必要なすべてのリポジトリを取得した後、--nofetch フラグを使用してオフラインでビルドできるようにする場合もあります。
Google Workspace
Sync は、すべてのリポジトリまたは構成された特定のリポジトリのセットに対して強制フェッチを実行しますが、fetch は特定のターゲットのフェッチにのみ使用されます。
Bzlmod
sync コマンドは適用されなくなりましたが、fetch にはさまざまなオプションがあります。ターゲット、リポジトリ、構成済みリポジトリのセット、または依存関係の解決とモジュール拡張機能に関与するすべてのリポジトリを取得できます。フェッチ結果はキャッシュに保存されます。フェッチを強制的に実行するには、フェッチ プロセスで
--forceオプションを指定する必要があります。
手動移行
このセクションでは、手動の Bzlmod 移行プロセスに役立つ情報とガイダンスを提供します。自動化された移行プロセスの詳細については、推奨される移行プロセスのセクションをご覧ください。
WORKSPACE で依存関係を把握する
移行の最初のステップは、依存関係を把握することです。推移的依存関係は *_deps マクロで読み込まれることが多いため、WORKSPACE ファイルに導入される正確な依存関係を把握することは難しい場合があります。
ワークスペース解決済みファイルを使用して外部依存関係を検査する
幸いなことに、フラグ --experimental_repository_resolved_file が役立ちます。このフラグは、基本的に、最後の Bazel コマンドで取得されたすべての外部依存関係の「ロックファイル」を生成します。詳しくは、こちらのブログ投稿をご覧ください。
次の 2 つの方法で使用できます。
特定のターゲットのビルドに必要な外部依存関係の情報を取得します。
bazel clean --expunge bazel build --nobuild --experimental_repository_resolved_file=resolved.bzl //foo:barWORKSPACE ファイルで定義されているすべての外部依存関係の情報を取得します。
bazel clean --expunge bazel sync --experimental_repository_resolved_file=resolved.bzlbazel syncコマンドを使用すると、WORKSPACE ファイルで定義されたすべての依存関係(以下を含む)を取得できます。bindの使用状況register_toolchainsとregister_execution_platformsの使用状況
ただし、プロジェクトがクロス プラットフォームの場合、一部のリポジトリ ルールはサポートされているプラットフォームでのみ正しく実行されるため、特定のプラットフォームで bazel sync が失敗する可能性があります。
コマンドを実行すると、resolved.bzl ファイルに外部依存関係の情報が格納されます。
bazel query を使用して外部依存関係を検査する
bazel query を使用して、次のリポジトリルールを検査することもできます。
bazel query --output=build //external:<repository name>
bazel query は外部依存関係のバージョンについて嘘をつく可能性があるため、使用には注意が必要です。Bzlmod を使用した外部依存関係のクエリと検査は、新しいサブコマンドによって実現されます。
組み込みのデフォルトの依存関係
--experimental_repository_resolved_file で生成されたファイルを確認すると、WORKSPACE で定義されていない依存関係が多数見つかります。これは、Bazel がユーザーの WORKSPACE ファイルのコンテンツに接頭辞と接尾辞を追加して、通常はネイティブ ルール(@bazel_tools、@platforms、@remote_java_tools など)で必要となるデフォルトの依存関係を挿入するためです。Bzlmod では、これらの依存関係は組み込みモジュール bazel_tools で導入されます。これは、他のすべての Bazel モジュールのデフォルトの依存関係です。
段階的な移行のためのハイブリッド モード
Bzlmod と WORKSPACE は並行して動作できるため、WORKSPACE ファイルから Bzlmod への依存関係の移行を段階的に行うことができます。
WORKSPACE.bzlmod
移行中、Bazel ユーザーは Bzlmod が有効になっているビルドと有効になっていないビルドを切り替える必要がある場合があります。プロセスをスムーズにするために、WORKSPACE.bzlmod のサポートが実装されています。
WORKSPACE.bzlmod の構文は WORKSPACE とまったく同じです。Bzlmod が有効になっている場合、ワークスペースのルートに WORKSPACE.bzlmod ファイルも存在する場合は、次のようになります。
WORKSPACE.bzlmodが有効になり、WORKSPACEの内容は無視されます。- WORKSPACE.bzlmod ファイルに接頭辞や接尾辞は追加されません。
WORKSPACE.bzlmod ファイルを使用すると、移行が容易になります。
- Bzlmod が無効になっている場合、元の WORKSPACE ファイルから依存関係を取得するようにフォールバックします。
- Bzlmod が有効になっている場合、WORKSPACE.bzlmod を使用して、移行する依存関係をより適切に追跡できます。
リポジトリの公開設定
Bzlmod は、特定のリポジトリから他のリポジトリを可視にするかどうかを制御できます。詳細については、リポジトリ名と厳密な依存関係をご覧ください。
WORKSPACE も考慮した場合の、さまざまなタイプのリポジトリのリポジトリの公開設定の概要は次のとおりです。
| メイン リポジトリから | Bazel モジュール リポジトリから | モジュール拡張機能リポジトリから | WORKSPACE リポジトリから | |
|---|---|---|---|---|
| メイン リポジトリ | 表示 | ルート モジュールが直接依存関係の場合 | ルート モジュールがモジュール拡張機能をホストするモジュールの直接の依存関係である場合 | 表示 |
| Bazel モジュール リポジトリ | 直接の依存関係 | 直接の依存関係 | モジュール拡張機能をホストするモジュールの直接依存関係 | ルート モジュールの直接依存関係 |
| モジュール拡張機能リポジトリ | 直接の依存関係 | 直接の依存関係 | モジュール拡張機能をホストするモジュールの直接依存関係 + 同じモジュール拡張機能によって生成されたすべてのリポジトリ | ルート モジュールの直接依存関係 |
| WORKSPACE リポジトリ | すべて表示 | 非表示 | 非表示 | すべて表示 |
手動移行プロセス
一般的な Bzlmod 移行プロセスは次のようになります。
- WORKSPACE にどのような依存関係があるかを把握します。
- プロジェクトのルートに空の MODULE.bazel ファイルを追加します。
- 空の WORKSPACE.bzlmod ファイルを追加して、WORKSPACE ファイルの内容をオーバーライドします。
- Bzlmod を有効にしてターゲットをビルドし、どのリポジトリが欠落しているかを確認します。
- 解決された依存関係ファイルで、不足しているリポジトリの定義を確認します。
- 不足している依存関係を Bazel モジュールとして、モジュール拡張機能を通じて導入するか、後で移行するために WORKSPACE.bzlmod に残します。
- 4 に戻り、すべての依存関係が使用可能になるまで繰り返します。
Bazel モジュールを公開する
Bazel プロジェクトが他のプロジェクトの依存関係である場合は、Bazel Central Registry でプロジェクトを公開できます。
BCR でプロジェクトをチェックインするには、プロジェクトのソース アーカイブ URL が必要です。ソース アーカイブを作成する際は、次の点に注意してください。
アーカイブが特定のバージョンを指していることを確認します。
BCR は、バージョン付きのソース アーカイブのみを受け入れることができます。これは、Bzlmod が依存関係の解決中にバージョン比較を行う必要があるためです。
アーカイブ URL が安定していることを確認します。
Bazel はハッシュ値でアーカイブの内容を検証するため、ダウンロードしたファイルのチェックサムが変更されないようにする必要があります。URL が GitHub の場合は、リリース ページでリリース アーカイブを作成してアップロードしてください。GitHub は、オンデマンドで生成されたソース アーカイブのチェックサムを保証しません。つまり、
https://github.com/<org>/<repo>/releases/download/...の形式の URL は安定していると見なされますが、https://github.com/<org>/<repo>/archive/...は安定しているとは見なされません。詳細については、GitHub アーカイブ チェックサムの停止をご覧ください。ソースツリーが元のリポジトリのレイアウトに従っていることを確認します。
リポジトリが非常に大きく、不要なソースを削除してサイズを縮小した配布アーカイブを作成する場合は、削除したソースツリーが元のソースツリーのサブセットであることを確認してください。これにより、エンドユーザーは
archive_overrideとgit_overrideを使用して、モジュールを非リリース バージョンに簡単にオーバーライドできます。最も一般的な API をテストするテスト モジュールをサブディレクトリに含めます。
テスト モジュールは、公開される実際のモジュールに依存するソース アーカイブのサブディレクトリにある独自の WORKSPACE ファイルと MODULE.bazel ファイルを含む Bazel プロジェクトです。最も一般的な API をカバーする例や統合テストを含める必要があります。設定方法については、テスト モジュールをご覧ください。
ソース アーカイブの URL が準備できたら、BCR 投稿ガイドラインに沿って、GitHub の Pull Request を使用してモジュールを BCR に送信します。
リポジトリに BCR に公開 GitHub アプリを設定して、モジュールを BCR に送信するプロセスを自動化することを強くおすすめします。
ベスト プラクティス
このセクションでは、外部依存関係をより適切に管理するために従うべきベスト プラクティスをいくつか説明します。
不要な依存関係の取得を避けるため、ターゲットを異なるパッケージに分割します。
#12835 を確認してください。ここでは、テストのデベロッパー依存関係が、必要のないターゲットをビルドするために不必要に取得されるようになっています。これは実際には Bzlmod 固有のものではありませんが、この方法に従うと、開発依存関係を正しく指定しやすくなります。
開発依存関係を指定する
bazel_dep ディレクティブと use_extension ディレクティブの dev_dependency 属性を true に設定すると、依存プロジェクトに伝播されなくなります。ルート モジュールとして、--ignore_dev_dependency フラグを使用して、ターゲットが開発依存関係とオーバーライドなしでビルドされるかどうかを確認できます。
コミュニティの移行の進行状況
Bazel Central Registry を確認して、依存関係がすでに利用可能かどうかを確認できます。それ以外の場合は、この GitHub ディスカッションに参加して、移行を妨げている依存関係に賛成票を投じるか、投稿してください。
問題を報告する
既知の Bzlmod の問題については、Bazel GitHub の問題リストをご確認ください。移行のブロックを解除するのに役立つ新しい問題や機能リクエストを、お気軽にお送りください。