上下文
我正在编写一个存储库规则,它调用另一个Bazel项目。我目前的方法是将附加项目构建为deploy。我希望用户能够实例化规则如下:
jar_path = some/relative/path
my_rule(name = "something", p_arg="m_arg", binary=jar_path)然后给出jar_path和参数,我希望存储库规则在shell中执行以下命令:
java -jar $(SOME_JAR) $(ARGUMENTS_PROVIDED_BY_RULE) 问题
First,尚不清楚如何最好地完成deploy方法。到目前为止,我尝试了两种不同的方法,取得了不同程度的成功。例如,我浏览了scala_rules、maven_rules和云雀食谱。
第二个,更重要的是,我不确定deploy是否是实现目标的最佳途径。同样,我的兴趣是从当前托管在github上的外部Bazel项目中调用一个目标。(非常可行,我可以尝试使用http_archive规则获取该项目)。
下面,我描述了我所做的尝试。
方法1
我的第一种方法是尝试使用command字段在ctx.action中执行命令。我尝试了各种枚举
java -jar {computed_absolute_path_of_deploy_jar} {args_passed_from_instantiation}. 这里我最大的问题是确定deploy的绝对路径。文件的根路径,将包含一些附加信息。例如,它会喜欢这样的东西。
/abs/olute/path[ something ]/rela/tive/path顺便提一句,我不确定这是否是一个bug/nit,但是File.root.path,评估为None,尽管File.none不是None。
涉及到的我的第一个方法是试图使用skylark ctx.binary
方法2
接下来,我尝试模仿输入二进制示例从医生那里。这也是不成功的。问题是无法找到实际的二进制文件。下面是我如何配置它的方法。
首先,我将存储库规则放宽为普通的skylark规则。
def _test_binary(ctx):
ctx.action(
....
arguments = [ctx.attr.p_arg],
executable = ctx.executable.binary)
test_binary = rule(
...
attrs = {
"binary":attr.label(mandatory=True, cfg="host", allow_files=True, executable=True),
...
}然后,在我的外部项目中,我将skylark规则加载到工作区文件中。最后,我从一个构建文件中调用了宏,如下所示:
load("@something_rule//:something_rule.bzl", "test_binary")
test_binary(name = "hello", p_arg = "hello", binary = "script.sh")脚本是一行java -jar something_deploy.jar -- -arg:$1,与构建文件位于同一个目录中。
Bazel抱怨src/script.sh不存在。我猜是因为它在/private/var/tmp/-bazel_username/somehash/relative_path中查找文件。作为回应,我试图通过绝对路径,这是不允许的。
干杯。
发布于 2017-06-30 16:36:57
看起来,您将存储库规则与构建扩展(“正常”规则)混为一谈。一个好的经验法则是:
我真的不认为你需要用这两种方法。您说另一个项目在GitHub上,所以可以将以下内容添加到您的工作区文件中:
http_archive(
name = "other_project",
...
)然后,在构建文件中:
genrule(
name = "run-a-jar",
srcs = ["@other_project//some/relative:path"],
cmd = "java -jar $(location @other_project//some/relative:path) -- arg1 arg2 > $@",
outs = ["jar-output"],
)您不应该使用_deploy.jar目标,因为您不会将jar从它的项目中移出(当您需要重新定位它时,_deploy.jar很有用)。
你问题中的其他问题:
我不确定这是否是一个bug/nit,但是File.root.path,评估为None,
你确定它没有被评估为""?路径相对于执行根,因此对于源,它将始终是"" (对于输出,它将是bazel-out/local-fastbuild/bin或类似的)。
Bazel抱怨src/script.sh不存在。
将-s传递给Bazel确实可以帮助调试Skylark规则。你可以确切地看到它在看什么。
https://stackoverflow.com/questions/44836401
复制相似问题