Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bazel Skylark-如何从存储库规则执行jar 上下文_Bazel - Fatal编程技术网

Bazel Skylark-如何从存储库规则执行jar 上下文

Bazel Skylark-如何从存储库规则执行jar 上下文,bazel,Bazel,我正在编写一个调用另一个Bazel项目的存储库规则。我当前的方法是将附加项目构建为部署jar。我希望用户能够实例化规则,如: 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) 问题 首先

我正在编写一个调用另一个Bazel项目的存储库规则。我当前的方法是将附加项目构建为部署jar。我希望用户能够实例化规则,如:

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_规则和云雀食谱

其次,更重要的是,我不确定部署jar是否是实现目标的最佳途径。同样,我感兴趣的是从外部Bazel项目调用目标,该项目当前托管在github上。(因此,我可以尝试使用http_归档规则获取项目)

下面,我将描述我所做的尝试

方法1 我的第一种方法是尝试使用
ctx.action
中的
command
字段执行命令。我试过各种各样的数字

java -jar {computed_absolute_path_of_deploy_jar} {args_passed_from_instantiation}. 
这里我最大的问题是确定部署jar的绝对路径。文件的根路径将包含一些附加信息。例如,它会像这样

/abs/olute/path[ something ]/rela/tive/path
作为补充说明,我不确定这是否是一个bug/nit,但是
File.root.path
的计算结果为无,尽管
File.None
不是无

涉及的是试图使用云雀[
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-jarsomething\u deploy.jar---arg:$1
,与构建文件位于同一目录中

Bazel抱怨src/script.sh不存在。我猜测是因为它正在
/private/var/tmp/-bazel_username/somehash/relative_path
中查找文件。作为回应,我试图通过绝对路径,这是不允许的


干杯。

看起来您将存储库规则与构建扩展(“正常”规则)混为一谈。一个好的经验法则是:

  • 存储库规则用于将源代码放到您的系统中,或将它们符号链接到Bazel可以看到它们的地方
  • 构建扩展适用于其他一切:编译、复制文件、运行二进制文件等
事实上,我认为你不需要使用这两种方法。您说另一个项目位于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"],
)
您不需要使用
\u deploy.jar
目标,因为您没有将jar移出其项目(
\u deploy.jar
在需要重新定位时非常有用)

你问题中的其他内容:

我不确定这是否是一个bug/nit,但文件.root.path的计算结果为无

您确定它的计算结果不是
“”
?路径是相对于执行根的,因此对于源,路径将始终是
“”
(对于输出,路径将是
bazel out/local fastbuild/bin
或类似路径)

Bazel抱怨src/script.sh不存在


-s
传递给Bazel确实有助于调试云雀规则。您可以看到它的确切位置。

看起来您将存储库规则与构建扩展(“正常”规则)混为一谈。一个好的经验法则是:

  • 存储库规则用于将源代码放到您的系统中,或将它们符号链接到Bazel可以看到它们的地方
  • 构建扩展适用于其他一切:编译、复制文件、运行二进制文件等
事实上,我认为你不需要使用这两种方法。您说另一个项目位于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"],
)
您不需要使用
\u deploy.jar
目标,因为您没有将jar移出其项目(
\u deploy.jar
在需要重新定位时非常有用)

你问题中的其他内容:

我不确定这是否是一个bug/nit,但文件.root.path的计算结果为无

您确定它的计算结果不是
“”
?路径是相对于执行根的,因此对于源,路径将始终是
“”
(对于输出,路径将是
bazel out/local fastbuild/bin
或类似路径)

Bazel抱怨src/script.sh不存在


-s
传递给Bazel确实有助于调试云雀规则。你可以准确地看到它在看什么。

你能再解释一下你试图从另一个回购协议中运行的目标吗?它是做什么的?你能再解释一下你试图从另一个回购协议中获得的目标吗?它有什么作用?