Получение метаданных git из правила git_repository - PullRequest
0 голосов
/ 05 октября 2018

До этого коммита (впервые включенного в 0.17.0) я мог использовать genrule для сбора метаданных git из внешних репозиториев git.

По сути это выглядело какthis:

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) на самом деле не должна влиять на воспроизводимость сборок.

Мой оригинальный подход состоял в том, чтобы попытаться передать git SHA и gitметаданные, которые мне как-то понадобились через --workspace_status_command, но тогда мне также пришлось бы использовать этот мерзавец SHA для клонирования git_repository, что я не считаю возможным.

Есть ли другой способ собратьэта информация?

1 Ответ

0 голосов
/ 16 октября 2018

Прежде всего, использование genrule обычно не работает, так как оно зависит не только от заявленных входов.Как вы сами заметили, песочница обнаруживает эти необъявленные (и, следовательно, не отслеживаемые bazel) входами.

Причина, по которой подкаталог .git удаляется как часть правила git_repository, состоит в том, чтобы иметь воспроизводимое содержимоевнешний репозиторий в проверяемой машиной форме .Однако все части правила репозитория, включая 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 файл внешнего репозитория.

...