如何获取给定 Bazel 目标的输出文件?

7
理想情况下,我希望能够在不进行构建的情况下获取一个目标输出文件列表。我认为这可以通过运行后分析的cquery实现,但是我不知道如何操作。
4个回答

5
这是我的output.cquery文件。
def format(target):
  outputs = target.files.to_list()
  return outputs[0].path if len(outputs) > 0 else "(missing)"

您可以按照以下方式运行:
bazel cquery //a/b:bundle --output starlark \
  --starlark:file=output.cquery 2>/dev/null

bazel-out/darwin-fastbuild/bin/a/b/something-bundle.zip

关于cquery的更多信息,请参阅文档。


1

我对Engene的答案进行了轻微的改进,因为目标的输出可能是多个:

bazel cquery  --output=starlark  \
--starlark:expr="'\n'.join([f.path for f in target.files.to_list()])"  \
//foo:bar

1
在这里,“输出文件”到底是什么意思?你是想知道如果在命令行上构建目标生成的文件吗?
你希望在什么时候获得这些信息?你真的想调用 bazel query 命令来获取这些信息,还是想在分析过程中获取?我不认为有一种方法可以使用 bazel query 来获取输出文件的确切期望绝对路径(甚至是工作区相对路径,例如 bazel-out/foo/bar/baz.txt)。
这可能比你想象的要复杂一些,但 请求输出文件 提供了一些关于在 Starlark 中指定输出文件的信息,并简要介绍了如何获取有关依赖项输出文件的信息(请参见 DefaultInfo)。

你是想知道在命令行构建目标后生成的文件吗?是的,确切地说。 你希望在什么时候获取这些信息?理想情况下,我希望能够在命令行中运行 bazel cquery 'kind("output files", //foo)' 并返回一个输出文件列表。现在我想起来了,为了解决我正在尝试解决的问题,我可以创建一个 bazel 规则,将其依赖项的输出文件转储到文本文件中。当然,那仍然需要进行构建,所以这并没有回答我的原始问题。 - larry
你的意思是想知道在命令行上构建目标时生成的文件吗?为了澄清,我想知道构建目标时生成的文件,但不包括其依赖项生成的文件。 - larry

0
最近的Bazel版本现在已经内置了这个功能,可以使用--output files来实现。
bazel cquery //a/b:bundle --output files 2>/dev/null

# bazel-out/darwin-fastbuild/bin/a/b/something-bundle.zip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接