gpt4 book ai didi

versioning - 如何在分析时在 bazel 中运行 shell 命令?

转载 作者:行者123 更新时间:2023-12-03 22:57:54 28 4
gpt4 key购买 nike

我正在尝试将 mercurial 版本烘焙到我的 Bazel 文件中,以便我可以得到如下内容:

# These I set manually, since they're "semantic"
MAJOR_VERSION = 2
MINOR_VERSION = 3
BUGFIX_VERSION = 1

# This should be the result of `hg id -n`
BUILD_VERSION = ?

apple_bundle_version(
name = "my_version",
build_version = "{}.{}.{}.{}".format(MAJOR_VERSION, MINOR_VERSION, BUGFIX_VERSION, BUILD_VERSION),
short_version_string = "{}.{}.{}".format(MAJOR_VERSION, MINOR_VERSION, BUGFIX_VERSION),
)

这显然不是密封的,所以我知道它违反了 Bazel 的一些假设,所以我愿意接受其他选择。

以下是一些可能的选择:
  • 实际运行hg id -n在 Bazel 分析期间,我不知道该怎么做。
  • 通过命令行传递构建版本,例如,--define=build_version=$(hg id -n) .不幸的是,这需要一个单独的命令来包装 bazel build .
  • 手动设置 BUILD_VERSION .显然,这会很烦人。

  • 有没有办法做到#1?我的其他选择是什么?

    最佳答案

    是的,您可以使用自定义 --workspace_status_command 和处理信息并使用此数据生成源文件的 genrule 来完成此操作。

    编辑:我删除了关于 --stamp 标志的部分,它不需要。

    概括

  • 使用 --workspace_status_command=/path/to/binary 构建,使用自定义二进制或 shell 脚本运行 hg 并输出您需要的信息。
  • genrule 写一个 stamp=1

  • 细节

    1. --workspace_status_command=/path/to/binary
    --workspace_status_command=<path> 标志允许您指定一个二进制文件。

    Bazel 在每次构建之前运行这个二进制文件。二进制文件应该将键值对写入标准输出。 Bazel 将 key 分为两个桶:“stable”和“volatile”。 (“stable”和“volatile”这两个名字有点违反直觉,所以不要想太多。)

    Bazel 然后将键值对写入两个文件:
  • bazel-out/stable-status.txt 包含所有键名以 STABLE_
  • 开头的键和值
  • bazel-out/volatile-status.txt 包含其余的键和它们的值

  • 契约(Contract)是:
  • 如果可能,“稳定”键的值应该很少改变。如果 stable-status.txt 的内容发生变化,它会使依赖于它们的操作失效,例如genrule.cmd 如果该 genrule 有 stamp=1 。换句话说,如果稳定键的值发生变化,它将使 Bazel 重建加盖操作。因此稳定状态不应该包含时间戳之类的东西,因为它们一直在变化,并且会让 Bazel 在每次构建时重建加盖的 Action 。
  • “ volatile ”键的值可能经常改变。 Bazel 希望它们像时间戳一样随时更改,并及时更新 volatile-status.txt 文件。但是,为了避免一直重建标记的 Action ,Bazel 假装 volatile 文件永远不会改变。换句话说,如果 volatile 状态文件是唯一一个内容发生更改的文件,则不会使依赖于它的操作无效。如果 Action 的其他输入已更改,则 Bazel 会重建该 Action ,然后该 Action 可以使用更新后的 volatile 状态。但仅是 volatile 状态的变化不会使操作无效。
  • my-status.sh 示例:
    #!/bin/bash
    echo STABLE_GIT_BRANCH $(git rev-parse HEAD)
    echo MY_TIMESTAMP $(date)

    2. 用 genrule 写一个 stamp=1

    这个属性没有记录,这让我很惊讶。我会提交一个关于这个的错误。
    foo/BUILD 示例:
    genrule(
    name = "x",
    srcs = ["input.txt"],
    outs = ["x.txt"],
    cmd = " ; ".join([
    "( echo 'volatile data:'",
    "cat bazel-out/volatile-status.txt",
    "echo ---",
    "echo 'stable data:'",
    "cat bazel-out/stable-status.txt",
    ") > $@",
    ]),
    stamp = 1,
    )

    把这一切放在一起

    未重建 genrule

    ...当只有 bazel-out/volatile-status.txt 改变时:
      $ bazel build --workspace_status_command=/tmp/foo/ws.sh //foo:x &>/dev/null && cat bazel-genfiles/foo/x.txt
    volatile data:
    BUILD_TIMESTAMP 1512379211456
    MY_TIMESTAMP Mon Dec 4 10:20:11 CET 2017
    ---
    stable data:
    BUILD_EMBED_LABEL
    BUILD_HOST <redacted>
    BUILD_USER <redacted>
    STABLE_GIT_BRANCH d3fed125d00f6f61bfbfe05f4566656cdac1ea6e

    $ cat bazel-out/volatile-status.txt
    BUILD_TIMESTAMP 1512379425898
    MY_TIMESTAMP Mon Dec 4 10:23:45 CET 2017

    $ bazel build --workspace_status_command=/tmp/foo/ws.sh //foo:x &>/dev/null && cat bazel-genfiles/foo/x.txt
    volatile data:
    BUILD_TIMESTAMP 1512379211456
    MY_TIMESTAMP Mon Dec 4 10:20:11 CET 2017
    ---
    stable data:
    BUILD_EMBED_LABEL
    BUILD_HOST <redacted>
    BUILD_USER <redacted>
    STABLE_GIT_BRANCH d3fed125d00f6f61bfbfe05f4566656cdac1ea6e

    $ cat bazel-out/volatile-status.txt
    BUILD_TIMESTAMP 1512379441919
    MY_TIMESTAMP Mon Dec 4 10:24:01 CET 2017

    重新构建了genrule

    ...当稳定状态或 genrule 的输入改变时:
      $ echo bar > foo/input.txt 

    $ bazel build --workspace_status_command=/tmp/foo/ws.sh //foo:x &>/dev/null && cat bazel-genfiles/foo/x.txt
    volatile data:
    BUILD_TIMESTAMP 1512379566646
    MY_TIMESTAMP Mon Dec 4 10:26:06 CET 2017
    ---
    stable data:
    BUILD_EMBED_LABEL
    BUILD_HOST <redacted>
    BUILD_USER <redacted>
    STABLE_GIT_BRANCH d3fed125d00f6f61bfbfe05f4566656cdac1ea6e


    $ git checkout HEAD~1 &>/dev/null

    $ bazel build --workspace_status_command=/tmp/foo/ws.sh //foo:x &>/dev/null && cat bazel-genfiles/foo/x.txt
    volatile data:
    BUILD_TIMESTAMP 1512379594890
    MY_TIMESTAMP Mon Dec 4 10:26:34 CET 2017
    ---
    stable data:
    BUILD_EMBED_LABEL
    BUILD_HOST <redacted>
    BUILD_USER <redacted>
    STABLE_GIT_BRANCH b3da717469e23f5293297175a80709956416fd2c

    关于versioning - 如何在分析时在 bazel 中运行 shell 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47622645/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com