Как мне реализовать local_archive() в старларке
Я хочу реализовать правило хранилища starlark, которое берет tar.gz из каталога WORKSPACE (я помещаю туда файлы в git LFS) и извлекает его, затем использует извлеченное содержимое как внешний репозиторий (то есть извлекает файл, затем делает эквивалент local_repository()
в этом каталоге).
Я пробовал следующее:
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "workspace_and_buildfile", "patch")
def _local_archive_impl(repository_ctx):
if repository_ctx.attr.build_file and repository_ctx.attr.build_file_content:
fail("Only one of build_file and build_file_content can be provided.")
repository_ctx.extract(repository_ctx.path(repository_ctx.attr.archive).basename, "", repository_ctx.attr.strip_prefix)
patch(repository_ctx)
workspace_and_buildfile(repository_ctx)
но похоже, что этот подход не будет работать, так как правила репозитория Starlark не могут получить доступ к каталогу WORKSPACE (?!?).
Я также попробовал подход, упомянутый в https://groups.google.com/forum/m/, а именно:
def _impl(ctx):
ctx.execute(["tar", "zxf", ctx.attr.archive)
local_archive = repository_rule(
implementation = _impl,
local = True,
attrs = {'archive': attr.string()}
)
но это тоже не работает:(.
1 ответ
Вы можете получить путь к рабочей области, объявив атрибут, метка которого указывает на файл в корне рабочей области. Например, рассмотрим:
my_local_repository = repository_rule(
implementation = _local_repository_impl,
attrs = {
"_workspace": attr.label(
default = Label("//:WORKSPACE"),
),
}
Где:
def _local_repository_impl(repository_ctx):
ws_dir = repository_ctx.path(repository_ctx.attr._workspace).dirname
Затем перечислите / найдите свой архив и идите оттуда.
Тем не менее, это выглядит очень похоже на вашу первую попытку. Возможно, вы можете обновить свой вопрос, включив в него определение repository_rule, в котором вы объявляете атрибут "archive".
Отказ от ответственности: я только напечатал это как псевдокод, фактически не проверял это, но я использовал эту технику прежде. НТН.