我正在尝试将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的一些假设,所以我对其他选择持开放态度.
这里有一些可能的选择:
实际上hg id -n
在Bazel分析期间运行,我不知道该怎么做.
在via命令行中传递构建版本,例如--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
.--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重建每个构建的标记操作.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)
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,
)
Run Code Online (Sandbox Code Playgroud)
......只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的输入发生变化时:
$ 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)
归档时间: |
|
查看次数: |
1295 次 |
最近记录: |