我想实现一个starlark存储库规则,它从工作空间目录(我将文件放在那里的git LFS中)中提取一个tar.gz并将其提取,然后将提取的内容用作外部存储库(即,提取文件,然后在该目录上执行相当于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存储库规则似乎无法访问工作区目录(?!?)。
我还尝试了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()}
)但这也不起作用:(。
发布于 2019-08-01 02:08:27
您可以通过声明标签指向工作区根目录中的文件的属性来获取工作区的路径。例如,考虑以下内容:
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。
https://stackoverflow.com/questions/57227011
复制相似问题