【问题标题】:How to resolve a dependency in an external package workspace_file?如何解决外部包workspace_file中的依赖关系?
【发布时间】:2019-07-04 19:57:26
【问题描述】:

尝试使用来自通过http_archive 导入的外部包中的build_file 中的目标,该外部包具有通过workspace_file 属性在外部包工作区中定义的依赖项失败。我在 Debian 测试中使用 Bazel 0.27.0。

该文档仅讨论了在提供的build_file 中引用目标,但我找不到任何信息如何在提供的build_file 中引用在提供的workspace_file 中定义的依赖项。

通常的@stringtemplate3//jar 语法失败,但我不知道如何包含对导入存档的引用,根据手册必须以@antlr3_runtimes 开头。

项目布局如下:

├── antlr.BUILD
├── antlr.WORKSPACE
├── BUILD
├── external_dependency
│   └── src
│       └── main
│           └── java
│               └── bazel
│                   ├── BUILD
│                   └── Hello.java
├── LICENSE
└── WORKSPACE

WORKSPACE 定义如下所示:

workspace(name="bazel")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "antlr3_runtimes",
    sha256 = "d4f7d3c38c5523f8009ff37528e5797c81adb454be6acc9af507cfcb41f2016f",
    strip_prefix = "antlr3-master",
    urls = ["https://github.com/ibre5041/antlr3/archive/master.tar.gz"],
    build_file = "@//:antlr.BUILD",
    workspace_file = "@//:antlr.WORKSPACE",
)

似乎提供的workspace_file 甚至没有被分析。尝试解析自定义构建文件中的依赖项时,构建已经失败。

可以在此处找到重现:https://github.com/marcohu/bazel

bazel build //... 显示此错误消息:

ERROR: /home/user/.cache/bazel/_bazel_user/64492308e78c9898c41f12c18dd29b63/external/antlr3_runtimes/BUILD.bazel:43:1: no such package '@stringtemplate3//jar': The repository '@stringtemplate3' could not be resolved and referenced by '@antlr3_runtimes//:antlr3_tool'
ERROR: Analysis of target '//external_dependency/src/main/java/bazel:hello' failed; build aborted: no such package '@stringtemplate3//jar': The repository '@stringtemplate3' could not be resolved

我在 Bazel 问题跟踪器中报告了此问题,但被拒绝并提示在此处发布。

这个用例是不可能的吗?还是我语法错误?

【问题讨论】:

    标签: bazel


    【解决方案1】:

    至少到目前为止(我想这个说法在未来的版本中可能会改变),bazel 不直接支持传递的外部依赖。 WORKSPACE 文件即使在您的情况下仍会被读取,如果它包含完全损坏的语法,它仍然会失败,但它不会被“采取行动”,您可以(当前)例如从不存在的标签加载或调用未定义的函数,并且对于嵌套的WORKSPACE 仍然不明智。

    你基本上有两个选择:

    1. 在“父级”/top WORKSPACE 中重复嵌套依赖项(http_archive 规则)。

    2. 您可以使用相应的存储库规则定义一个函数,您可以在“父级”/top WORKSPACE 中加载和调用这些规则。

    【讨论】:

    • 谢谢。我在想http_archive 工作区可以独立运行,但遗憾的是这似乎是不可能的。
    【解决方案2】:

    Bazel 实际上确实支持 jvm 依赖项的传递获取。 https://github.com/bazelbuild/rules_jvm_external

    工作空间

    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    
    rules_jvm_external_tag = "2.0.1"
    
    rules_jvm_external_sha = "55e8d3951647ae3dffde22b4f7f8dee11b3f70f3f89424713debd7076197eaca"
    
    http_archive(
        name = "rules_jvm_external",
        sha256 = rules_jvm_external_sha,
        strip_prefix = "rules_jvm_external-%s" % rules_jvm_external_tag,
        url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % rules_jvm_external_tag,
    )
    
    load("@rules_jvm_external//:defs.bzl", "maven_install")
    
    maven_install(
        name = "maven",
        artifacts = [
            "io.grpc:grpc-netty-shaded:1.22.1",
            "io.grpc:grpc-api:1.22.1",
            "io.grpc:grpc-testing:1.22.1",
            "io.grpc:grpc-core:1.22.1",
            "junit:junit:4.12",
        ],
        repositories = [
            "https://jcenter.bintray.com/",
            "https://repo1.maven.org/maven2",
        ],
    )
    

    构建

    ...
    java_library(
        name = "hyphenation-service",
        srcs = ["src/test/java/com/example/hyphenation/HyphenationServiceTest.java"],
        deps = ["@maven//:io_grpc_grpc_core"]
    )
    ...
    

    示例存储库https://github.com/mancini0/bazel-grpc-playground

    【讨论】:

    • 这是第 2 点的情况,您可以使用(自定义)函数/规则来做到这一点,但是它与目前不支持的跨外部依赖项的传递依赖项不同。
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 2013-06-03
    • 2012-01-31
    • 2023-03-11
    • 2014-11-06
    • 2019-01-03
    • 1970-01-01
    相关资源
    最近更新 更多