代码之家  ›  专栏  ›  技术社区  ›  petros-eskinder

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

  •  1
  • petros-eskinder  · 技术社区  · 8 年前

    上下文

    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 .作为回应,我试图通过绝对路径,这是不允许的。

    干杯

    1 回复  |  直到 8 年前
        1
  •  4
  •   kris    8 年前

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

    • 存储库规则用于将源代码放到系统中,或将其符号链接到Bazel可以看到的地方。
    • 构建扩展适用于其他一切:编译、复制文件、运行二进制文件等。

    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 target,因为您没有将jar移出其项目( _部署.jar

    您问题中的其他内容:

    你确定它没有评估为 "" (对于输出,将为 bazel-out/local-fastbuild/bin

    经过 -s Bazel真的可以帮助调试Skylark规则。你可以准确地看到它在看什么。