Bazel - 取决于生成的输出

Bazel - depend on generated outputs

我在 Bazel monorepo 中有一个 yaml 文件,其中包含我想在多种语言中使用的常量。这有点像 protobuff 的创建和使用方式。

如何在构建时解析此 yaml 文件并依赖于输出?

例如:

item1: "hello"
item2: "world"
nested:
  nested1: "I'm nested"
  nested2: "I'm also nested"

然后我需要解析这个 yaml 文件,以便它可以用于许多不同的语言(例如,Rust、TypeScript、Python 等)。例如,这是 TypeScript 所需的输出:

export default {
  item1: "hello",
  item2: "world",
  nested: {
    nested1: "I'm nested",
    nested2: "I'm also nested",
  }
}

注意,我不想要读取 yaml 文件并将其转换为对象的 TypeScript 代码。该转换应该在构建过程中完成。

对于实际的转换,我正在考虑将其写在 Python 中,但这并不需要。这意味着 python 在构建时也需要 运行。


P.S。我最关心的是功能,所以我很灵活地知道它是如何完成的。除了 yaml,我什至可以使用其他文件格式。

多亏@oakad 的帮助,我才弄明白了。本质上,您可以使用 genrule 来创建输出。

所以,假设你有一些像 python 这样的目标设置来生成名为 parse_config 的输出,你可以这样做:

genrule(
    name = "generated_output",
    srcs = [],
    outs = ["output.txt"],
    cmd = "./$(execpath :parse_config) > $@" % name,
    exec_tools = [":parse_config"],
    visibility = ["//visibility:public"],
)

生成的文件是output.txt。您可以通过 //lib/config:generated_output.

访问它

请注意,cmd 实质上是将 stdout 传送到文件内容中。在 Python 中,这意味着任何打印的内容都会出现在生成的文件中。