在this提交之前(首先包含在0.17.0中),我能够使用genrule
从外部git存储库中收集git元数据。
实际上看起来像这样:
genrule(
name = "git-describe-foo",
# We can't dep all of @foo, so we pick a file
srcs = ["@foo//:SOME_FILE"],
outs = ["my_version"],
# Do a git describe and strip off the leading "v"
cmd = "git -C $$(dirname $(location @foo//:SOME_FILE)) describe --tags | cut -c 2- > $@",
# I don't know if this is strictly necessary
stamp = True,
# This is required or bazel will sandbox us with just SOME_FILE
local = True,
output_to_bindir = True,
)
但是,由于.git/
目录现在已被删除,因此它不再起作用。我知道这样做是为了提高可重复性,但是git SHA(理论上是git历史记录)实际上不应影响构建的可重复性。
我最初的方法是尝试以某种方式通过--workspace_status_command
传递我需要的git SHA和git元数据,但是随后我还必须使用该git SHA来克隆git_repository
,我认为这是不可能的。
还有另一种收集此信息的方法吗?
答案 0 :(得分:1)
首先,您对genrule
的使用通常被破坏了,因为它所依赖的不仅仅是声明的输入。如您所知,沙箱会检测到这些未声明(因此未被bazel
跟踪)的输入。
作为.git
规则的一部分删除git_repository
子目录的原因是要在machine-verifiable form中具有外部存储库的可复制内容。但是,在删除patch_cmds
子目录之前,将执行存储库规则的所有部分,包括.git
。因此,您可以将元数据创建为存储库本身的一部分,例如,如下所示。
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
remote = "...",
...
patch_cmds = [
"git log -n 1 --format=%H > VERSION",
],
)
有两件事要记住。
为具有可复制性,元数据应完全由提交本身确定。
请确保已导出添加的元数据文件,例如,通过将exports_files(["VERSION"])
修补到外部存储库的BUILD
文件中。