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

如何在Bazel中为py_binary动态生成Target列表?

解决方案

Bazel的分析阶段(加载BUILD文件时执行generate_target())和构建阶段(执行genrule/ctx.actions.run)是分离的,你之前尝试的方法都是在构建阶段执行脚本,无法在分析阶段获取结果。正确的做法是用**仓库规则(Repository Rule)**在仓库初始化阶段运行脚本,生成可被加载的target列表配置。

步骤1:定义仓库规则生成target配置

修改deps.bzl,添加仓库规则实现:

def _generate_targets_repo_impl(repository_ctx):
    # 调用你的Python脚本,获取target列表输出
    exec_result = repository_ctx.execute([
        "python3",
        repository_ctx.path(repository_ctx.attr.script),
        # 若脚本需要参数,在此添加,比如"--config", "path/to/config.yaml"
    ])
    
    if exec_result.return_code != 0:
        fail(f"生成target列表失败:{exec_result.stderr}")
    
    # 将脚本输出写入到仓库的bzl文件中
    repository_ctx.file(
        "generated_targets.bzl",
        content = f"TARGETS = {exec_result.stdout.strip()}",
    )

generate_targets_repo = repository_rule(
    implementation = _generate_targets_repo_impl,
    attrs = {
        "script": attr.label(allow_single_file = True),
    },
)

def generate_target():
    # 加载仓库规则生成的target列表
    load("@generated_targets//:generated_targets.bzl", "TARGETS")
    return TARGETS

步骤2:在WORKSPACE中调用仓库规则

添加以下内容到WORKSPACE文件,指定你的Python脚本路径:

load("//:deps.bzl", "generate_targets_repo")

generate_targets_repo(
    name = "generated_targets",
    script = "//:your_target_generator.py",  # 替换为你的Python脚本路径
)

步骤3:确保Python脚本输出合法格式

你的Python脚本必须输出严格的Python列表字符串,示例如下:

# your_target_generator.py示例
def main():
    # 从配置文件读取或动态生成target列表
    targets = ["//:target0", "//:target1", "//:target2"]
    print(repr(targets))  # 确保输出是合法的Python列表格式

if __name__ == "__main__":
    main()

步骤4:修改BUILD文件使用生成的target列表

修正原BUILD文件的语法错误(glob(*.py)需改为glob(["*.py"])),然后正常调用generate_target():

load("//:deps.bzl", "generate_target")

py_binary(
    name = "launch",
    srcs = glob(["*.py"]),
    data = generate_target(),
)

关键说明

  • 仓库规则在仓库初始化阶段执行,早于BUILD文件的分析阶段,因此生成的target列表可以被generate_target()加载使用。
  • 脚本输出必须纯净,不能包含额外的调试打印信息,否则会导致generated_targets.bzl语法错误。
  • 如果脚本依赖其他配置文件,需要在仓库规则的attrs中添加依赖声明,确保Bazel能追踪到这些文件的变化。

内容的提问来源于stack exchange,提问作者JustMe77

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:16:24