首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在starlark中实现local_archive()

如何在starlark中实现local_archive()
EN

Stack Overflow用户
提问于 2019-07-27 05:05:37
回答 1查看 199关注 0票数 0

我想实现一个starlark存储库规则,它从工作空间目录(我将文件放在那里的git LFS中)中提取一个tar.gz并将其提取,然后将提取的内容用作外部存储库(即,提取文件,然后在该目录上执行相当于local_repository()的操作)。

我尝试过以下几种方法:

代码语言:javascript
复制
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中提到的方法,即:

代码语言:javascript
复制
def _impl(ctx):
  ctx.execute(["tar", "zxf", ctx.attr.archive)

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

但这也不起作用:(。

EN

回答 1

Stack Overflow用户

发布于 2019-08-01 02:08:27

您可以通过声明标签指向工作区根目录中的文件的属性来获取工作区的路径。例如,考虑以下内容:

代码语言:javascript
复制
my_local_repository = repository_rule(
implementation = _local_repository_impl,
attrs = {
    "_workspace": attr.label(
        default = Label("//:WORKSPACE"),
    ),
}

其中:

代码语言:javascript
复制
def _local_repository_impl(repository_ctx):
    ws_dir = repository_ctx.path(repository_ctx.attr._workspace).dirname

然后列出/找到你的归档文件,并从那里开始。

但是,这看起来与您的第一次尝试非常相似。也许您可以更新您的问题,使其包含声明“repository_rule”属性的存档定义。

免责声明:我只是以伪代码的形式输入了这段代码,实际上并没有对其进行测试,但我以前使用过这种技术。HTH。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57227011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档