如何显示打包到宏中的所有显式 bazel 目标

How to reveal all the explicit bazel targets packed into a macro

我正在诊断一些代码生成器,它由一些由自定义 bazel 规则支持的 bazel 宏支持。

#projX/BUILD
macro_foo(
    name = "foo_data"
    ...
)

py_binary(
    name = "client_foo_data",
    deps = [":foo_data"]
    ...
)

如果我构建原始宏目标,代码生成实际上不会执行。如果我构建一个反向依赖于 foo_data 的目标,代码生成器会执行。

bazel build //projX:foo_data # doesn't trigger codegen
bazel build //projY:client_foo_data # does codegen

如何为给定目标找出所有不同的目标名称?我怀疑我需要构建其中一个特定的变体来刺激代码生成;某种 bazel 查询或在宏下解压缩目标的东西应该可以解决问题。


VScode Codelens Build/Test 链接

作为一个直接适用的旁白,在 VSCode 中,它用于修饰我的宏和其他扩展到多个 bazel 目标的东西,我可以单击链接来启动构建或测试(一些升级丢失这种能力对我来说,我过去常常依靠它来找到这些目标变体)。这就是他们所谓的 codelens 功能

CodeLens links in BUILD files to directly launch a build or test by simply clicking on the targets

https://github.com/bazelbuild/vscode-bazel#features

注释“另一个快捷方式”可以在这里一睹为快 https://kig.re/2020/03/21/building-intellij-bazel-plugin.html

了解 bazel 插件用于发现从给定目标展开的所有特定目标变体的机制应该指向正确的方向。如果有一些关于此细节的 concept/vocabulary/terminology 知道这也将有助于理解正在发生的事情。

bazel query --output=build //projX:all 将在宏和全局扩展后打印出该包中的所有目标。它对每个目标的宏扩展堆栈跟踪进行了注释,包括宏定义的文件名和行号。

//projX:allwildcard which specifies all the targets in that package 的形式。宏只能在单个包中生成目标,因此将始终包括从该宏调用生成的所有目标。

所以我找到了 vscode 插件使用的查询,他们基本上使用了一种规则查询

  const queryResult = await new BazelQuery(
    bazelExecutable,
    workspace,
    `kind(rule, ${pkg}:all)`,
    [],
  ).queryTargets();

https://github.com/bazelbuild/vscode-bazel/blob/12c20773c5bbbdbbd30cc393c414622059c05537/src/bazel/bazel_utils.ts#L45-L50

为了得到我想要的东西,我 运行 下面的命令...

bazel query 'kind(rule, //projX:all)' | grep foo_data

暴露了我们在规则中使用的所有“后缀”变体,例如

//projX:foo_data_variant1
//projX:foo_data_variant2
//projX:foo_data_variant3
...
//projX:foo_data

那个 all 技巧是关键,如果我 运行 只包含目标名称的命令,我只会得到那个 :-(

bazel query 'kind(rule, //projX:foo_data)'
//projX:foo_data

旁注

在我所从事的项目的用例中存在欺骗性的是,传递到宏中的“basename”实际上用作宏中的目标。所以我遇到的谬误是认为因为宏有一个名称参数,该宏本身就是一个目标,它不是,而且给宏的名称传递给一些实际的 bazel 规则可能很好target 不应与宏混淆,即使它们共享一个通用名称。一个是成为实际标签一部分的名称,另一个只是 macro/function.

的参数