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

Jes*_*der 1 versioning bazel

我正在尝试将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),
)
Run Code Online (Sandbox Code Playgroud)

这显然不是密封的,所以我知道这违反了Bazel的一些假设,所以我对其他选择持开放态度.

这里有一些可能的选择:

  1. 实际上hg id -n在Bazel分析期间运行,我不知道该怎么做.

  2. 在via命令行中传递构建版本,例如--define=build_version=$(hg id -n).不幸的是,这需要一个单独的命令来包装bazel build.

  3. 手动设置BUILD_VERSION.显然,这会很烦人.

有没有办法做#1?我还有什么其他选择?

Lás*_*zló 8

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

编辑:我删除了有关--stamp旗帜的部分,这是不需要的.

摘要

  1. 使用--workspace_status_command=/path/to/binary自定义二进制或shell脚本进行构建,该脚本运行hg并输出所需的信息.
  2. genrulestamp=1.

细节

1. --workspace_status_command=/path/to/binary

--workspace_status_command=<path>标志允许您指定二进制文件.

Bazel在每次构建之前运行此二进制文件.二进制文件应该将键值对写入stdout.Bazel将密钥划分为两个桶:"稳定"和"易变".(名称"稳定"和"易变"有点违反直觉,因此不要过多考虑它们.)

然后Bazel将键值对写入两个文件:

  • bazel-out/stable-status.txt 包含键名称开头的所有键和值 STABLE_
  • bazel-out/volatile-status.txt 包含其余的键及其值

合同是:

  • 如果可能的话,"稳定"键的值应该很少改变.如果stable-status.txt更改内容,则会使依赖于它们的操作无效,例如,genrule.cmd如果该genrule具有stamp=1.换句话说,如果稳定键的值发生变化,它将使Bazel重建标记的动作.因此,稳定状态不应包含时间戳等内容,因为它们会一直更改,并且会使Bazel重建每个构建的标记操作.
  • "易变"键的值可能会经常变化.Bazel希望他们像时间戳一样随时更改,并适时更新volatile-status.txt文件.为了避免一直重建标记动作,Bazel假装易变文件永远不会改变.换句话说,如果易失性状态文件是唯一内容已更改的文件,则不会使依赖于它的操作无效.如果操作的其他输入已更改,则Bazel会重建该操作,然后操作可以使用更新的易失性状态.但只是单独变化的状态不会使行动失效.

示例my-status.sh:

#!/bin/bash
echo STABLE_GIT_BRANCH $(git rev-parse HEAD)
echo MY_TIMESTAMP $(date)
Run Code Online (Sandbox Code Playgroud)

2.写genrulestamp=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,
)
Run Code Online (Sandbox Code Playgroud)

把它们放在一起

genrawle没有重建

......只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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)