我想使用通过 workspace_status_command 传递给 bazel 的 CI 的构建号来版本构建工件。有时我想在工件名称中包含内部版本号。
有没有办法在编写宏时如何访问ctx
(正如我试图使用的那样ctx.info_file
)?到目前为止,我似乎能够在创建新规则时仅在新规则中访问此类信息,在这种情况下有点尴尬。
我想拥有内部版本号或类似信息是很常见的用例,所以我想知道是否有更简单的方法来访问这些信息。
不,您确实需要定义一个自定义规则才能使用从workspace_status_command
通过info_file
和version_file
文件传递的信息,即使这样您也不能只从 Starlark 访问它的值,您可以将文件传递给您的工具(包装器)并在那里处理输入。毕竟,(构建)规则不执行任何操作,它们发出要在稍后阶段执行的操作。
不过要小心,因为如果您依赖info_file
(STABLE_*
条目),对文件的更改会根据它使目标无效。对于诸如 CI 内部版本号之类的东西,它通常不是您想要的,version_file
而更有可能是您所追求的。您可能想要记录 id,但您通常不想仅仅因为构建 ID 已更改(这是新的 CI 运行)而重新构建内容。但是,如果您希望结果完全可重现,即使简单地包含 ID 也可能会被认为是有问题的。
拥有可变工件名称是一个全新的问题,并且有充分的理由不这样做。但通常由于提议的名称将在执行操作期间确定(version_file
在您的工具中读取),因此您已经过了分析阶段来决定操作的结果。我目前知道的唯一方法(即对于变量输入的树外源,您当然可以始终load
从您的BUILD
文件中定义一个 Starlark 变量和它)能够做到这一点的是使用树工件(declare_directory
在您的规则。