如何将宏应用于bazel中的目标名称数组?

Gre*_*sky 1 build bazel

我有一个bazel包,它必须使用我为这种情况编写的相同宏生成大量可执行文件(示例).是否可以将它应用于目标名称数组而不是像这样一个一个地列出它们?

simple_program(
    name = "example1",
)

simple_program(
    name = "example2",
)

simple_program(
    name = "example3",
)
Run Code Online (Sandbox Code Playgroud)

ahu*_*sky 6

只写出你需要的所有规则的一个好处是你的构建文件更具说明性.构建文件(宏等)中存在的逻辑越多,就越难以弄清楚正在发生的事情.使用声明性构建文件,您可以使用Buildozer等工具来执行大规模重构.

也就是说,有办法做你所要求的.一种是在构建文件中使用列表推导:

[simple_rule(name = n) for n in [
    "example1",
    "example2",
    "example3",
]]
Run Code Online (Sandbox Code Playgroud)

另一种是使用宏:

bzl文件:

def generate_simple_rules(names):
  for name in names:
    simple_rule(name = name)
Run Code Online (Sandbox Code Playgroud)

构建文件:

load("your bzl file", "generate_simple_rules")
generate_simple_rules(["example1", "example2", "example3"])
Run Code Online (Sandbox Code Playgroud)