首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Skylark -如何从存储库规则执行jar

Skylark -如何从存储库规则执行jar
EN

Stack Overflow用户
提问于 2017-06-29 23:19:38
回答 1查看 1.6K关注 0票数 1

上下文

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

代码语言:javascript
复制
jar_path = some/relative/path
my_rule(name = "something", p_arg="m_arg", binary=jar_path)

然后给出jar_path和参数,我希望存储库规则在shell中执行以下命令:

代码语言:javascript
复制
java -jar $(SOME_JAR) $(ARGUMENTS_PROVIDED_BY_RULE) 

问题

First,尚不清楚如何最好地完成deploy方法。到目前为止,我尝试了两种不同的方法,取得了不同程度的成功。例如,我浏览了scala_rules、maven_rules和云雀食谱。

第二个,更重要的是,我不确定deploy是否是实现目标的最佳途径。同样,我的兴趣是从当前托管在github上的外部Bazel项目中调用一个目标。(非常可行,我可以尝试使用http_archive规则获取该项目)。

下面,我描述了我所做的尝试。

方法1

我的第一种方法是尝试使用command字段在ctx.action中执行命令。我尝试了各种枚举

代码语言:javascript
复制
java -jar {computed_absolute_path_of_deploy_jar} {args_passed_from_instantiation}. 

这里我最大的问题是确定deploy的绝对路径。文件的根路径,将包含一些附加信息。例如,它会喜欢这样的东西。

代码语言:javascript
复制
/abs/olute/path[ something ]/rela/tive/path

顺便提一句,我不确定这是否是一个bug/nit,但是File.root.path,评估为None,尽管File.none不是None。

涉及到的我的第一个方法是试图使用skylark ctx.binary

方法2

接下来,我尝试模仿输入二进制示例从医生那里。这也是不成功的。问题是无法找到实际的二进制文件。下面是我如何配置它的方法。

首先,我将存储库规则放宽为普通的skylark规则。

代码语言:javascript
复制
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规则加载到工作区文件中。最后,我从一个构建文件中调用了宏,如下所示:

代码语言:javascript
复制
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中查找文件。作为回应,我试图通过绝对路径,这是不允许的。

干杯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-30 16:36:57

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

  • 存储库规则用于将源放到您的系统上,或者将它们链接到Bazel可以看到它们的地方。
  • 构建扩展名用于其他所有内容:编译、复制文件、运行二进制文件等。

我真的不认为你需要用这两种方法。您说另一个项目在GitHub上,所以可以将以下内容添加到您的工作区文件中:

代码语言:javascript
复制
http_archive(
    name = "other_project",
    ...
)

然后,在构建文件中:

代码语言:javascript
复制
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规则。你可以确切地看到它在看什么。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44836401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档