Bazel 从git_存储库规则获取git元数据

Bazel 从git_存储库规则获取git元数据,bazel,Bazel,在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"

在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\u status\u命令传入我需要的git-SHA和git元数据,但是我还必须使用该git-SHA来克隆git\u存储库,我认为这是不可能的


有没有其他方法来收集这些信息

首先,您对genrule的使用通常是不正确的,因为它依赖的不仅仅是声明的输入。正如您自己所注意到的,沙箱检测这些未声明的,因此未被bazel输入跟踪

作为git_repository规则的一部分,删除.git子目录的原因是,外部存储库中的内容是可复制的。但是,在删除.git子目录之前,将执行存储库规则的所有部分,包括patch_cmds。因此,您可以创建元数据作为存储库本身的一部分,例如,如下所示

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]修补到外部存储库的构建文件中


欢迎来到堆栈溢出!请参加本次参观并阅读帮助中心,特别是如何提问。你在这里的最佳选择是做你的研究,搜索相关的话题,然后尝试一下。在做了更多的研究和搜索之后,发布一个最小的、完整的、可验证的你尝试的例子,并具体说明你在哪里被卡住了,这可以帮助你得到更好的答案@JonathanGagne嗯不知道我哪里出错了。bazel社区通常希望人们使用bazel标记询问有关堆栈溢出的问题。我想一个bazel专家会根据我的示例规则准确地知道我遇到的问题。也许这更适合GitHub问题?