Bzlmod 通过从 Bazel 注册表(Bazel 模块数据库)请求依赖项的信息来发现依赖项。目前,Bzlmod 仅支持 索引注册表(遵循特定格式的本地目录或静态 HTTP 服务器 )。
索引注册表
索引注册表是本地目录或静态 HTTP 服务器,其中包含有关模块列表的信息,包括模块的主页、维护人员、每个版本的 MODULE.bazel 文件,以及如何提取每个版本的源代码。值得注意的是,它不需要提供源代码归档本身。
索引注册表必须遵循以下格式:
/bazel_registry.json:一个 JSON 文件,其中包含注册表的元数据,例如:mirrors:指定用于源代码归档的镜像列表。 镜像网址是镜像本身与模块的源代码网址(由其source.json文件指定,不含协议)的串联。例如,如果模块的源代码网址为https://foo.com/bar/baz,并且mirrors包含["https://mirror1.com/", "https://example.com/mirror2/"],那么 Bazel 将按顺序尝试的网址为https://mirror1.com/foo.com/bar/baz、https://example.com/mirror2/foo.com/bar/baz,最后是原始 源代码网址本身https://foo.com/bar/baz。module_base_path:指定source.json文件中具有local_repository类型的模块的基本路径
/modules:一个目录,其中包含此注册表中每个模块的子目录/modules/$MODULE:一个目录,其中包含此模块的每个版本的子目录,以及:metadata.json:一个 JSON 文件,其中包含有关模块的信息,具有以下字段:homepage:项目主页的网址maintainers:JSON 对象列表,每个对象对应于注册表中模块的维护人员的信息。 请注意,这不一定与项目的作者相同versions:此注册数据库中要查找的此模块的所有版本的列表yanked_versions:此模块的已撤消 版本的映射。键应为要撤消的版本,值应为撤消该版本的原因说明,最好包含指向更多信息的链接
/modules/$MODULE/$VERSION:一个目录,其中包含以下文件:MODULE.bazel:此模块版本的MODULE.bazel文件source.json:一个 JSON 文件,其中包含有关如何提取此模块版本的源代码的信息- 默认类型为“archive”,表示
http_archive代码库,具有以下字段:url:源代码归档的网址mirror_urls:字符串列表,即源代码归档的镜像网址。 这些网址在url之后按顺序尝试,作为备份。integrity:归档的子资源 完整性 校验和strip_prefix:提取源代码归档时要剥离的目录前缀patches:一个映射,其中包含要应用于提取的归档的补丁文件。补丁文件位于/modules/$MODULE/$VERSION/patches目录下。键是补丁文件名,值是补丁文件的完整性校验和patch_strip:与 Unixpatch的--strip实参相同。archive_type:下载文件的归档类型(与type上的http_archive相同)。 默认情况下,归档类型由网址的文件扩展名确定。如果文件没有扩展名,您可以明确指定以下其中一项:"zip"、"jar"、"war"、"aar"、"tar"、"tar.gz"、"tgz"、"tar.xz"、"txz"、"tar.zst"、"tzst"、tar.bz2、"ar"或"deb"。
- 可以更改类型以使用 git 代码库,具有以下字段:
type:git_repository- 以下字段,如 https://bazel.build/rules/lib/repo/git 中所述:
remotecommitshallow_sincetaginit_submodulesverbosestrip_prefix
- 可以更改类型以使用本地路径,表示
local_repository代码库,具有以下字段:type:local_pathpath:代码库的本地路径,计算方式如下:- 如果
path是绝对路径,则保持不变 - 如果
path是相对路径,而module_base_path是 绝对路径,则解析为<module_base_path>/<path> - 如果
path和module_base_path都是相对路径,则 解析为<registry_path>/<module_base_path>/<path>。 注册表必须托管在本地,并由--registry=file://<registry_path>使用。否则,Bazel 将抛出错误
- 如果
- 默认类型为“archive”,表示
patches/:一个可选目录,其中包含补丁文件,仅当source.json具有“archive”类型时使用
Bazel 中央注册表
https://bcr.bazel.build/ 处的 Bazel 中央注册表 (BCR) 是一个索引注册表,其内容由 GitHub 仓库bazelbuild/bazel-central-registry 提供支持。您可以使用
https://registry.bazel.build/处的 Web 前端浏览其内容。
Bazel 社区维护 BCR,欢迎贡献者提交 pull 请求。请参阅 BCR 贡献 准则。
除了遵循普通索引注册表的格式之外,BCR 还要求
每个模块版本
(/modules/$MODULE/$VERSION/presubmit.yml)都有一个 presubmit.yml 文件。此文件指定了一些基本的
build 和测试目标,您可以使用这些目标来检查此模块
版本的有效性。BCR 的 CI 流水线也使用此文件来确保模块之间的互操作性。
选择注册表
可重复的 Bazel 标志 --registry 可用于指定要从中请求模块的注册表列表,因此您可以将项目设置为从第三方或内部注册表提取依赖项。较早的注册表优先。为方便起见,您可以将 --registry 标志列表放在项目的 .bazelrc 文件中。
如果您的注册表托管在 GitHub 上(例如,作为 bazelbuild/bazel-central-registry 的分支),则您的 --registry 值需要 raw.githubusercontent.com 下的原始 GitHub 地址。例如,在 main
分支的 my-org 分支上,您应设置
--registry=https://raw.githubusercontent.com/my-org/bazel-central-registry/main/。
使用 --registry 标志会阻止默认使用 Bazel 中央注册表,但您可以通过添加 --registry=https://bcr.bazel.build 将其添加回来。