0

我想实现一个starlark存储库规则,它从WORKSPACE目录中获取一个tar.gz(我将文件放在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/#!topic/bazel-discuss/UXvp0rksRMM中提到的方法,即:

def _impl(ctx):
  ctx.execute(["tar", "zxf", ctx.attr.archive)

local_archive = repository_rule(
    implementation = _impl,
    local = True,
    attrs = {'archive': attr.string()}
)

但这也不起作用:(。

4

1 回答 1

0

您可以通过声明属性 who label 指向工作空间根目录中的文件来获取工作空间的路径。例如,考虑:

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 定义。

免责声明:我只是将其作为伪代码输入,并没有实际测试它,但我以前使用过这种技术。HTH。

于 2019-07-31T18:08:26.543 回答