我正在寻找一种方法来向
MODULE.bazel
提供 local_path_override
文件。
示例:
模块.bazel:
bazel_dep(name = "fmt", version = "10.1.1")
local_path_override(
module_name = "fmt",
# Local copy of https://github.com/fmtlib/fmt at some newer commit as 10.1.1
# Does not have a MODULE.bazel file
path = "../third_party/fmt",
)
我真正想做的是这样的:
bazel_dep(name = "fmt", version = "10.1.1")
local_path_override(
module_name = "fmt",
module_file = "//:fmt.MODULE.bazel", # provide a MODULE.bazel file here
# Local copy of https://github.com/fmtlib/fmt at some newer commit as 10.1.1
# Does not have a MODULE.bazel file
path = "../third_party/fmt",
)
我想从外部提供一份
MODULE.bazel
,因为本地副本没有。请注意,属性 module_file
并不存在,这只是我想象的一个想法。
使用工作空间方法,它的工作方式如下:
new_local_repository(
name = "fmt",
build_file = "//:fmt.BUILD",
path = "../third_party/fmt",
)
我在 Bzlmod 世界中寻找类似的东西。
我也在想是否可以使用
archive_override
提供 MODULE.bazel
文件作为补丁。似乎 archive_override
可以处理 file://
URL,但据我了解,这不适用于相对路径名(例如 ../third_party/fmt
),并且需要我定义一个绝对系统特定路径。
顺便说一句:我正在使用 Bazel 6.3.2
Ondrej K. 是对的。 文档指出:
为了执行模块解析,Bazel 首先读取根模块的 MODULE.bazel 文件,然后从 Bazel 注册表中重复请求任何依赖项的 MODULE.bazel 文件,直到发现整个依赖关系图。
默认情况下,Bazel 选择每个模块的一个版本来使用。 Bazel 用一个存储库表示每个模块,并再次查阅注册表以了解如何定义每个存储库。
这就是为什么 MODULE.bazel 文件被嵌入到注册表中。在选择实际版本之前访问它们,即真实获取。此后修补它们没有效果。
要覆盖依赖项的
MODULE.bazel
,我的方法是创建本地注册表。这有点矫枉过正,但我怀疑到目前为止还会有其他方法(Bazel 7.1)。
假设您要覆盖
curl
版本 8.4.0
:
registry
,.bazelrc
:
common --registry=file:///%workspace%/registry
common --registry=https://bcr.bazel.build
registry
,该内容创建树
registry/modules/curl
。删除其他版本(目录和来自 metadata.json
)。registry/modules/curl/8.4.0/patches
中添加补丁并在registry/modules/curl/8.4.0/source.json
中引用它。字典值是完整性元数据,例如"sha256-" + base64_encode(hash)
。bazel clean --expunge
刷新分辨率数据。