Bazel 如何解决外部包工作区_文件中的依赖关系?

Bazel 如何解决外部包工作区_文件中的依赖关系?,bazel,Bazel,尝试从通过http\u archive导入的外部包中使用build\u文件中的目标,该目标通过workspace\u文件属性在外部包工作区中定义了依赖项,但失败。我正在Debian测试中使用Bazel0.27.0 该文档只谈到引用所提供的build\u文件中的目标,但我找不到如何引用所提供的workspace\u文件中定义的依赖项的任何信息 通常的@stringtemplate3//jar语法失败,但我不知道如何包含对导入的归档文件的引用,根据手册,该文件必须以@antlr3\u运行时开始 项目

尝试从通过
http\u archive
导入的外部包中使用
build\u文件
中的目标,该目标通过
workspace\u文件
属性在外部包工作区中定义了依赖项,但失败。我正在Debian测试中使用Bazel0.27.0

该文档只谈到引用所提供的
build\u文件
中的目标,但我找不到如何引用所提供的
workspace\u文件
中定义的依赖项的任何信息

通常的
@stringtemplate3//jar
语法失败,但我不知道如何包含对导入的归档文件的引用,根据手册,该文件必须以
@antlr3\u运行时开始

项目布局如下所示:

├── antlr.BUILD
├── antlr.WORKSPACE
├── BUILD
├── external_dependency
│   └── src
│       └── main
│           └── java
│               └── bazel
│                   ├── BUILD
│                   └── Hello.java
├── LICENSE
└── WORKSPACE
工作区的定义如下所示:

├── antlr.BUILD
├── antlr.WORKSPACE
├── BUILD
├── external_dependency
│   └── src
│       └── main
│           └── java
│               └── bazel
│                   ├── BUILD
│                   └── Hello.java
├── LICENSE
└── WORKSPACE
工作区(name=“bazel”)
加载(“@bazel_-tools//tools/build_-defs/repo:http.bzl”,“http_-archive”)
http\u档案(
name=“antlr3\u运行时”,
sha256=“d4f7d3c38c5523f8009ff37528e5797c81adb454be6acc9af507cfcb41f2016f”,
strip_prefix=“antlr3主控”,
URL=[”https://github.com/ibre5041/antlr3/archive/master.tar.gz"],
build_file=“@/:antlr.build”,
workspace_file=“@/:antlr.workspace”,
)
似乎提供的
workspace\u文件
甚至没有进行分析。生成在尝试解析自定义生成文件中的依赖项时已失败

可在此处找到复制:

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不直接支持可传递的外部依赖项<代码>工作区
文件仍然会被读取,即使在您的情况下,如果它包含完全破坏的语法,它仍然会失败,但它不会“被执行”,并且您可以(当前)从不存在的标签加载实例或调用未定义的函数,对于嵌套的
工作区
,它仍然是不明智的

您基本上有两种选择:

  • 在“父”//top
    工作区中重复嵌套的依赖项(
    http\u归档
    规则)

  • 您可以使用相应的存储库规则定义函数,并在“父”//top
    工作区中加载和调用这些规则


  • Bazel实际上支持jvm依赖项的可传递抓取

    工作区

    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"]
    )
    ...
    

    示例存储库

    谢谢。我认为http_archive
    工作区可以独立运行,但遗憾的是,这似乎是不可能的。第2点就是这样,你可以使用(自定义)函数/规则来实现这一点,但这与目前不支持的跨外部依赖的可传递依赖不同。