【问题标题】:How to find all publicly visible targets in a Bazel workspace如何在 Bazel 工作区中找到所有公开可见的目标
【发布时间】:2017-12-29 16:14:55
【问题描述】:

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

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

虽然大多数目标是隐式公开的,因为它们的BUILD 文件具有指定的默认公开可见性,例如

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

我需要一个所有此类目标的列表,以便在构建 Bazel 工作区后自动将它们的输出复制到某个位置。

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

【问题讨论】:

    标签: bazel


    【解决方案1】:

    我认为前面的答案确实涵盖了可见性属性限制结果的属性查询。对于后代,我要补充一点,如果您只是想从当前目录中查找所有目标,您可以这样做:

    bazel query ...
    

    【讨论】:

    • 我想你的意思是:bazel query //... 至少这对我有用。
    • 不,我的意思是...;这有效(从项目的根目录执行,不确定是否重要)。
    【解决方案2】:

    看这个例子:https://docs.bazel.build/versions/master/query-how-to.html#which-of-those-are-small-medium-large

    你需要这样的东西:

    bazel query 'attr(visibility, "//visibility:public", //path/to/package:*)'
    

    更新(2017-01-04):@Curious 询问目标的有效可见性,即考虑到default_visibility。 AFAIK Bazel 不支持。见issue #4388

    【讨论】:

    • 或者简单地说:bazel query 'attr(visibility, "//visibility:public", ...)'
    • 这有效,但只是部分,仅适用于那些具有明确指定的可见性属性的目标,例如visibility = ["//visibility:public"], 。我的问题是我们的许多BUILD 文件都在其中指定了包级别的可见性,例如package(default_visibility = ["//visibility:public"]) & 我希望此类 BUILD 文件中的所有目标都出现在我的查询中......看起来包级别的可见性没有传播到目标,用于查询目的......
    • 啊,您需要有效的可见性!我不认为 bazel 查询可以告诉你。我提交了功能请求:github.com/bazelbuild/bazel/issues/4388。不幸的是,我们现在没有人专门从事 bazel 查询,所以这可能需要等待。
    • 对于具有 default_visibility 的文件,使用它来查找不改变可见性的目标:bazel query 'attr(visibility, "", //path/to/package:*)' 稍加工作,您应该能够组合结果并获得所需的内容。我认为我们目前没有更好的解决方案。
    猜你喜欢
    • 2018-03-19
    • 2023-03-28
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多