You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:57:01