如何向 local_path_override 提供 MODULE.bazel 文件?

问题描述 投票:0回答:1

我正在寻找一种方法来向

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

bazel bzlmod
1个回答
0
投票

Ondrej K. 是对的。 文档指出

为了执行模块解析,Bazel 首先读取根模块的 MODULE.bazel 文件,然后从 Bazel 注册表中重复请求任何依赖项的 MODULE.bazel 文件,直到发现整个依赖关系图。

默认情况下,Bazel 选择每个模块的一个版本来使用。 Bazel 用一个存储库表示每个模块,并再次查阅注册表以了解如何定义每个存储库。

这就是为什么 MODULE.bazel 文件被嵌入到注册表中。在选择实际版本之前访问它们,即真实获取。此后修补它们没有效果。

要覆盖依赖项的

MODULE.bazel
,我的方法是创建本地注册表。这有点矫枉过正,但我怀疑到目前为止还会有其他方法(Bazel 7.1)。

假设您要覆盖

curl
版本
8.4.0
:

  1. 创建一个目录,例如
    registry
    ,
  2. 将以下内容添加到
    .bazelrc
    common --registry=file:///%workspace%/registry
    common --registry=https://bcr.bazel.build
    
  3. 该文件放入
    registry
  4. 使用
    该内容 
    创建树 registry/modules/curl。删除其他版本(目录和来自
    metadata.json
    )。
  5. registry/modules/curl/8.4.0/patches
    中添加补丁并在
    registry/modules/curl/8.4.0/source.json
    中引用它。字典值是完整性元数据,例如
    "sha256-" + base64_encode(hash)
  6. 运行
    bazel clean --expunge
    刷新分辨率数据。
© www.soinside.com 2019 - 2024. All rights reserved.