将protobuf文件作为依赖项添加到Bazel中的py_proto_library

时间:2017-11-15 17:23:40

标签: python protocol-buffers bazel

我想将a.proto导入b.proto并使用Bazel进行编译。

BUILD:

py_proto_library(
    name = "b_py_proto",
    protos = ["b.proto"],
    deps = [
        ":a_proto"
    ]
)

py_proto_library(
  name = "a_proto",
  protos = ["a.proto"]
)

b.proto

import public "a.proto";

当我使用Bazel运行它时,我得到does not have mandatory providers: 'py'.错误,即使根据示例here,它应该如何工作。

我尝试使用filegroup将a.proto添加为依赖项,同样的错误,因为显然deps需要python文件。 py_proto_library的运行方式是否与java_proto_library不同?如果是这样,我如何将a.proto添加为依赖项以便正确导入?

编辑: 我正在从https://github.com/pubref/rules_protobuf/archive/v0.8.1.tar.gz

加载protobuf

如果您将这些文件作为.proto传递,则此规则会接受proto_deps个文件,但我会收到错误Import "a.proto" was not found or had errors.

也许我应该以某种方式指定imports

2 个答案:

答案 0 :(得分:1)

上游protobuf提供的deps宏不像Bazel博客文章中描述的规则那样有效。 py_proto_library规则的py_proto_library可能只包含其他.proto规则。 srcs自己的文件必须放在 <div class="table-cellprop"> <div class="bottom-pane"> <div class="content-info"> <p>some imp text </p> <h3>title </h3> <div class="text-left"> some text with info <h4>title 2 </h4> <ul> <li class="bm-list"> li one </li> <li class="cm-list"> two </li> <li class="mm-list"> three </li> </ul> </div> </div> </div> </div> <div class="table-cellprop card-btm"> <div class="bottom-pane"> <div class="content-info"> TextTextTextTextTextTextTextTextTextTextTextText </div> </div> </div> <div class="table-cellprop card-btm"> <div class="bottom-pane"> <div class="content-info"> TextTextTextText </div> </div> </div>

答案 1 :(得分:1)

终于弄明白了。我的困惑来自于有不同的protobuf库具有不同的定义:

  1. https://github.com/pubref/rules_protobuf/blob/master/python/rules.bzl
  2. https://github.com/google/protobuf/blob/master/protobuf.bzl
  3. 我使用的是第一个,并且.proto依赖关系为proto_deps。我错过的另一件事是导入statemnt路径必须相对于WORKSPACE文件。

    b.proto:

    import public "path/relative/to/WORKSPACE/a.proto";
    

    BUILD:

    py_proto_library(
        name = "b_py_proto",
        protos = ["b.proto"],
        proto_deps = [
            ":a_proto"
        ]
    )
    
    py_proto_library(
      name = "a_proto",
      protos = ["a.proto"]
    )
    

    WORKSPACE:

    http_archive(
        name = "org_pubref_rules_protobuf",
        strip_prefix = "rules_protobuf-0.8.1",
        urls = ["https://github.com/pubref/rules_protobuf/archive/v0.8.1.tar.gz"],
        sha256 = "fb9852446b5ba688cd7178a60ff451623e4112d015c6adfe0e9a06c5d2dedc08"
    )
    
    load("@org_pubref_rules_protobuf//python:rules.bzl", "py_proto_repositories")
    py_proto_repositories()