从git_repository规则获取git元数据

时间:2018-10-05 03:05:21

标签: bazel

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,我认为这是不可能的。

还有另一种收集此信息的方法吗?

1 个答案:

答案 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文件中。