【问题标题】:How do I get workspace status in bazel如何在 bazel 中获取工作区状态
【发布时间】:2019-09-18 15:06:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: bazel skylark


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,得出同样的结论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多