代码之家  ›  专栏  ›  技术社区  ›  Zeitgeist

将protobuf文件作为依赖项添加到Bazel中的py\u proto\u库

  •  0
  • Zeitgeist  · 技术社区  · 7 年前

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

    构建:

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

    import public "a.proto";
    

    当我和Bazel一起运行时 does not have mandatory providers: 'py'. 错误,即使根据示例 here 这就是它应该如何工作。

    我尝试使用文件组添加一个.proto作为依赖项,但出现了相同的错误,因为显然 deps 需要python文件。 py\u proto\u库的操作是否与java\u proto\u库不同?如果是这样,我如何添加一个.proto作为依赖项,以便正确导入它?

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

    此规则接受 .proto 文件,如果您将其作为 proto_deps ,但我得到了一个错误 Import "a.proto" was not found or had errors.

    也许我应该具体说明一下 imports 以某种方式

    2 回复  |  直到 7 年前
        1
  •  2
  •   Zeitgeist    7 年前

    终于解决了这个问题。我的困惑来自这样一个事实,即有不同的protobuf库具有不同的定义:

    1. https://github.com/pubref/rules_protobuf/blob/master/python/rules.bzl
    2. https://github.com/google/protobuf/blob/master/protobuf.bzl

    我用的是第一个,那个用的是 .proto 依赖项为 proto_deps . 我遗漏的另一件事是导入语句路径必须相对于工作区文件。

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

    构建:

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

    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()
    
        2
  •  1
  •   Benjamin Peterson    7 年前

    这个 py_proto_library 上游protobuf提供的宏与Bazel博客文章中描述的规则不同。这个 deps py\u proto\u库 规则只能包含其他 py\u proto\u库 .proto 文件必须放入 srcs .