如何为local_path_override提供外部MODULE.bazel文件?
在Bazel 6.3.2 Bzlmod环境下依赖无MODULE.bazel的本地fmt模块
针对你的场景,这里有两种实用方案,替代new_local_repository的功能:
方案1:无侵入式生成临时MODULE.bazel
如果不想修改本地fmt源码树,可通过脚本在构建前自动生成MODULE.bazel到fmt目录,构建后可选清理:
- 写一个简单的生成脚本(比如
gen_fmt_module.sh):
#!/bin/bash TARGET_DIR="./path/to/local/fmt" cat > "${TARGET_DIR}/MODULE.bazel" << EOF module( name = "fmt", version = "9.1.0", # 替换为你实际用的fmt版本 ) bazel_dep(name = "bazel_skylib", version = "1.3.0") EOF
- 在主模块的
MODULE.bazel中配置local_path_override:
local_path_override( module_name = "fmt", path = "./path/to/local/fmt", )
- 构建前执行脚本,记得把生成的
MODULE.bazel加入fmt目录的.gitignore,避免影响源码仓库状态。
方案2:用自定义模块扩展包装本地仓库
如果完全不想碰本地fmt目录,可以通过自定义模块扩展来封装依赖:
- 在主模块下创建
extensions/fmt_wrapper.bzl:
def _fmt_wrapper_impl(module_ctx): # 引入本地fmt作为子仓库,指定外部BUILD文件 module_ctx.repository( name = "fmt", path = module_ctx.path("./path/to/local/fmt"), build_file = module_ctx.path("./extensions/fmt.BUILD"), ) # 声明模块依赖 module_ctx.add_dep(module = "fmt", version = "9.1.0") fmt_wrapper = module_extension(implementation = _fmt_wrapper_impl)
- 创建
extensions/fmt.BUILD,参考官方fmt的构建规则定义目标:
cc_library( name = "fmt", srcs = glob(["src/*.cc"]), hdrs = glob(["include/fmt/*.h"]), includes = ["include"], visibility = ["//visibility:public"], )
- 在主模块
MODULE.bazel中加载并启用扩展:
load("//extensions:fmt_wrapper.bzl", "fmt_wrapper") use_extension("//extensions", "fmt_wrapper")
补充说明
archive_override确实不支持相对路径补丁,不适合你的场景。上述两种方案都能实现类似new_local_repository指定外部构建配置的效果,按需选择即可。
内容的提问来源于stack exchange,提问作者Vertexwahn
相关产品推荐
相关产品推荐

