如何在Bazel上层包BUILD文件中获取下层data包所有目标并存入变量
解决方案
Bazel的BUILD文件在加载阶段是包隔离的,无法直接读取另一个包中定义的变量或target列表,最推荐的实现方式是将公共配置抽成Starlark扩展文件共享,具体步骤如下:
步骤1:新增共享配置文件
在data目录下新建defs.bzl文件,写入公共的目录配置和生成target名的方法:
# data/defs.bzl DATA_DIRS = [ "folder1", "folder2" ] def get_all_data_targets(): return ["my_cool_data_" + dir_name for dir_name in DATA_DIRS]
步骤2:修改data/BUILD复用公共配置
调整data/BUILD文件,加载上面的公共配置生成filegroup:
# data/BUILD load("//data:defs.bzl", "DATA_DIRS") [ filegroup( name = "my_cool_data_" + data_dir, srcs = glob(["{}/*.csv".format(data_dir)]), ) for data_dir in DATA_DIRS ]
步骤3:根目录BUILD加载配置生成目标
在根目录的BUILD文件中加载同一个配置文件,就能拿到所有data target的名称:
# 根目录BUILD load("//data:defs.bzl", "get_all_data_targets") data_targets = get_all_data_targets() [ py_binary( # 如果你希望命令是bazel run run_simulation_folder1,就用下面的name写法 name = "run_simulation_" + data_target.removeprefix("my_cool_data_"), srcs = ["run_simulation.py"], main = "run_simulation.py", data = ["//data:{}".format(data_target)], ) for data_target in data_targets ]
后续新增数据集时,只需要修改data/defs.bzl里的DATA_DIRS列表即可,两边的target会自动同步生成,不需要手动修改两处BUILD文件。
内容的提问来源于stack exchange,提问作者falsekeel
相关产品推荐
相关产品推荐

