Bazel:相对本地路径作为http_archive()中的url

时间:2019-11-19 15:20:48

标签: c++ bazel

我试图在我的Bazel项目中包括一个外部库。 它是一个商业的,封闭源代码的软件库,以tar文件(Linux)中的.h.a文件的形式出现。没有公共下载链接,您必须在某个地方手动下载存档。

因此,我在vendor/中将库存档检入了Git(这里不再讨论),并使用

http_archive(
    name = "library_name",
    build_file = "//third_party:library_name.BUILD",
    sha256 = "12165fbcbac............",
    urls = ["file:///home/myuser/git/repo/vendor/libraryname.tar.gz"],
)

我不想在urls=中使用绝对路径,因此我的同事可以结账并轻松构建库。如何在http_archive()中使用相对路径?

我看过this answer,但问题似乎不完全相同,示例不完整。

1 个答案:

答案 0 :(得分:0)

一个非常简单的custom repository rule可以为您做到这一点。 repository_ctx.extract完成了所有繁重的工作。我刚刚将其写成一个准系统的例子:

def _test_archive_impl(repository_ctx):
  repository_ctx.extract(repository_ctx.attr.src)
  repository_ctx.file("BUILD.bazel", repository_ctx.read(repository_ctx.attr.build_file))

test_archive = repository_rule(
    attrs = {
        "src": attr.label(mandatory = True, allow_single_file = True),
        "build_file": attr.label(mandatory = True, allow_single_file = True),
    },
    implementation = _test_archive_impl,
)

对于您的基本用例,您可能不需要对此进行任何更改(除了更好的名称)。添加通过stripPrefix的能力将非常简单。根据您的使用情况,build_file_contents和其他规则一样,而不是build_file也可能有用。

作为参考,这是我用于测试的WORKSPACE(上面的规则定义在test.bzl中):

load("//:test.bzl", "test_archive")

test_archive(
    name = "test_repository",
    src = "//:test.tar.gz",
    build_file = "//:test.BUILD",
)

作为所有替代方法,您只需从存档中检入文件,然后使用new_local_repository。在某些方面更易于使用,而在其他方面更难。