上下文
jar_path = some/relative/path
my_rule(name = "something", p_arg="m_arg", binary=jar_path)
然后给定jar_路径和参数,我希望存储库规则在shell中执行以下命令:
java -jar $(SOME_JAR) $(ARGUMENTS_PROVIDED_BY_RULE)
第一
,目前尚不清楚如何最好地完成部署jar方法。到目前为止,我尝试了两种不同的方法,取得了不同程度的成功。例如,我浏览了scala_规则、maven_规则和skylark食谱。
下面,我将描述我所做的尝试。
我的第一种方法是使用
command
字段输入
ctx.action
java -jar {computed_absolute_path_of_deploy_jar} {args_passed_from_instantiation}.
这里我最大的问题是确定部署jar的绝对路径。文件的根路径将包含一些附加信息。例如,它想要这样的东西。
/abs/olute/path[ something ]/rela/tive/path
File.root.path
,评估为无,尽管
File.none
不是没有。
My first approach
涉案人员试图使用云雀[
ctx.binary
]
接下来我试着模拟输入二进制示例
from the docs
。这也不成功。问题是找不到实际的二进制文件。下面是我如何配置它的。
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
/private/var/tmp/-bazel_username/somehash/relative_path
.作为回应,我试图通过绝对路径,这是不允许的。
干杯