如何解决Bazel 获取远程文件不是 WORKSPACE 规则?
在 Bazel 中,如何将远程文件作为构建规则而不是 WORKSPACE 规则获取?
我想使用构建规则,因为 WORKSPACE 规则不是为传递加载的。
例如这失败了
load("@bazel_tools//tools/build_defs/repo:http.bzl","http_file")
http_file(
name = "foo",urls = [ "https://example.com" ],sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",executable = True,)
repository_rule 中的错误:'repository rule http_file' 只能在工作区加载期间调用
解决方法
如果你真的想这样做,你必须实现你自己的规则,一个依赖 curl
来获取的简单例子可能是:
def _impl(ctx):
args = ctx.actions.args()
args.add("-o",ctx.outputs.out)
args.add(ctx.attr.url)
ctx.actions.run(
outputs = [ctx.outputs.out],executable = "curl",arguments = [args],)
get_stuff = rule(
_impl,attrs = {
"url": attr.string(
mandatory = True,),},outputs = {"out": "%{name}.out"},)
但是(尤其是在如此微不足道的情况下),它带来了问题。此外,您想在构建过程中跳出沙盒吗?您是否想在构建期间(在沙箱外)通过网络与某人交谈?绕过repository_cache
,并可能涉及remote_cache
(网络获取的网络缓存)。特别是在这个例子中,如果 url
指向的文件内容发生变化... build 不知道并且只在它没有这样做或 url
本身发生变化时才获取它。 IE。实现需要更加健壮(例如模仿 http_file
的实现)。
但实际上听起来您正在尝试解决一个不同的问题(可传递的外部依赖项,对此可能有另一种解决方案)。用于此的一个技巧是定义一个宏(在加载的第一级依赖项中定义下一跳),并在将第一步声明为父项目中的外部依赖项后,load
该宏并从父项目 WORKSPACE
。但这也有代价,即第一级依赖必须始终存在(已获取或已缓存),即使请求的构建目标实际上并不需要它(因为 load
和宏调用将始终拉取它)在).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。