如何在Bazel工作区中查找所有公开可见的目标

14

我正在尝试查询具有公共可见性的Bazel目标列表。我们的一些Bazel目标明确指定了visibility,例如:

cc_library(
    name = "xxx_util",
    visibility = ["//visibility:public",],
    ...
)

虽然大多数目标都是默认公开的,因为它们的BUILD文件中指定了默认的公开可见性,例如:

package(default_visibility = ["//visibility:public"])

我需要列出所有这样的目标,以便在我的 Bazel 工作空间构建完成后自动将它们的输出复制到特定位置。

我是 Bazel 的新手,无法弄清查询方式...

2个回答

18

我认为之前的回答已经覆盖了对可见性属性限制的结果进行属性查询的内容。为了后人着想,我要补充一点,如果你只想在当前目录中查找所有目标,可以这样做:

bazel query ...

4
我想你的意思是: bazel query //...至少这对我起作用了。 - Sergey Dryganets
1
不,我指的只是...; 这个有效(从项目根目录执行,不确定是否有影响)。 - Rubin Simons
"... "表示"当前目录下的所有内容",因此如果您的当前目录是项目的根目录,则"..."和"//..."是等效的。但是,如果您进入子目录,"..."将仅显示子目录下的目标,而"//..."将继续显示所有内容。" - Jack O'Connor

11

2
bazel query 'attr(visibility, "//visibility:public", ...)' - Picaud Vincent
这个是有效的,但只是部分有效,仅适用于那些明确指定了可见性属性的目标,例如 visibility = ["//visibility:public"]。我的问题是,我们许多 BUILD 文件中都指定了包级别的可见性,例如 package(default_visibility = ["//visibility:public"]),我希望所有这类 BUILD 文件中的目标都出现在我的查询结果中... 看起来包级别的可见性并没有传播到目标,无法进行查询... - Curious
2
啊,你需要有效的可见性!我不认为bazel query能告诉你这个。我已经提交了一个功能请求:https://github.com/bazelbuild/bazel/issues/4388。不幸的是,我们现在没有专门负责处理bazel query的人,所以这可能要等一段时间了。 - László
对于具有默认可见性的文件,请使用以下命令查找不更改可见性的目标: bazel query 'attr(visibility, "", //path/to/package:*)'经过一些处理,您应该能够将结果组合起来并获得所需的内容。我认为我们目前没有更好的解决方案。 - Laurent

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