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 中,这意味着任何打印的内容都会出现在生成的文件中。
我在 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 中,这意味着任何打印的内容都会出现在生成的文件中。