如何将JSON变量导入BUILD.bazel规则属性?附问题排查
解决方案:直接从JSON加载变量到多BUILD文件复用
错误根源
- 文件路径错误:仓库规则中使用
Label(":my_info.json")会指向新创建的外部仓库(@myjson)内的文件,而非本地项目中的JSON文件,导致无法读取内容,生成的config.bzl为空。 - 变量名不匹配:
BUILD.bazel中加载的MY_IMAGE与JSON里的MYIMAGE键名不一致。 - 加载路径错误:试图从本地路径加载仓库规则生成的
config.bzl,实际该文件位于外部仓库@myjson中。
修正后的代码示例
1. 修复仓库规则实现(projects/tools/parser/jsonparser.bzl)
def _load_my_json_impl(repository_ctx): # 读取项目根目录的my_info.json,使用绝对标签定位 json_file = repository_ctx.path(Label("//:my_info.json")) json_data = json.decode(repository_ctx.read(json_file)) # 生成Bazel变量定义语句 config_content = "\n".join([f"{key} = {repr(val)}" for key, val in json_data.items()]) repository_ctx.file("config.bzl", config_content) load_my_json = repository_rule( implementation = _load_my_json_impl, attrs = {}, # 声明依赖的本地文件,确保Bazel能追踪到JSON的变化 required_files = ["//:my_info.json"], )
2. WORKSPACE配置(保持原内容即可)
load("//projects/tools/parser:jsonparser.bzl", "load_my_json") load_my_json( name = "myjson" )
3. 修正BUILD文件加载逻辑(projects/tools/parser/BUILD.bazel)
load("@aspect_bazel_lib//lib:yq.bzl", "yq") # 从外部仓库@myjson加载生成的config.bzl,注意变量名与JSON键一致 load("@myjson//:config.bzl", "MYREPO", "MYIMAGE") yq( name = "convert", srcs = ["my_info2.json"], args = ["-P"], outs = ["bar.yaml"], # 示例:在规则属性中使用JSON变量 # args = ["-P", "--arg", "repo", MYREPO, "--arg", "image", MYIMAGE], )
跨BUILD文件复用
在任意需要使用这些变量的BUILD.bazel中,只需添加以下加载语句即可:
load("@myjson//:config.bzl", "MYREPO", "MYIMAGE")
验证执行
运行以下命令即可正常构建:
bazel build projects/tools/parser:convert
内容的提问来源于stack exchange,提问作者Michael Taquia
相关产品推荐
相关产品推荐

