如何在 bazel 中获取工作区状态

How do I get workspace status in bazel

我想对通过 workspace_status_command 传递给 bazel 的 CI 的内部版本号构建工件进行版本化。有时我想在工件名称中包含内部版本号。

有没有办法在编写宏时访问 ctx(因为我试图使用 ctx.info_file)?到目前为止,我似乎能够在创建新规则时仅在新规则中访问此类信息,这在这种情况下有点尴尬。

我想拥有内部版本号或类似信息是很常见的用例,所以我想知道是否有更简单的方法来访问此类信息。

不,您确实需要定义一个自定义规则才能使用从 workspace_status_command 通过 info_fileversion_file 文件传递​​的信息,即使这样您也不能只访问它的值从 Starlark,您可以将文件传递给您的工具(包装器)并在那里处理输入。毕竟,(构建)规则不执行任何操作,它们发出要在稍后阶段执行的操作。

不过要小心,因为如果您依赖于 info_fileSTABLE_* 条目),则对文件的更改会使依赖于它的目标无效。对于像 CI 内部版本号这样的东西,它通常不是您想要的,而 version_file 更可能是您想要的。您可能想要记录 ID,但您通常不想仅仅因为构建 ID 已更改(它是新的 CI 运行)而重建内容。但是,如果您希望结果完全可重现,即使简单地包含 ID 也会被认为是有问题的。

拥有可变的工件名称是一个全新的问题,并且有充分的理由不这样做。但一般来说,由于建议的名称将在执行操作期间决定(在您的工具中读取 version_file),因此您已经过了分析阶段来决定操作的结果。我目前知道的唯一方法(即对于变量输入的树源,你当然可以总是定义一个 Starlark 变量并从你的 BUILD 文件中 load 它)能够做到那就是使用树工件(在您的规则中使用 declare_directory