我试图在我的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,但问题似乎不完全相同,示例不完整。
答案 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。在某些方面更易于使用,而在其他方面更难。