从 Bazel 中的另一个项目导入原型

问题描述 投票:0回答:1

我的目录结构如下:

├── proto
│   ├── BUILD
│   └── hello.proto
├── src
│   ├── BUILD
│   └── outer.proto
└── WORKSPACE

proto/hello.proto
文件:

syntax = "proto3";
package hello;
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string msg = 1;
}

proto/BUILD
文件:

load("@rules_proto//proto:defs.bzl", "proto_library")
package(default_visibility = ["//visibility:public"])
proto_library(
    name = "hello_proto",
    srcs = ["hello.proto"],
)

src/outer.proto
文件:

syntax = "proto3";
import "proto/hello.proto"; // What path to import from?
message OuterMessage {
  HelloRequest req = 1;
  HelloReply resp = 2;
}

src/BUILD
文件:

load("@rules_proto//proto:defs.bzl", "proto_library")
proto_library(
    name = "outer_proto",
    srcs = ["outer.proto"],
    deps = ["//proto:hello_proto"],
)

当我运行

blaze build //src:outer_proto
时,出现以下错误:

src/outer.proto:6:3: "HelloRequest" is not defined.
src/outer.proto:7:3: "HelloReply" is not defined.
src/outer.proto:3:1: warning: Import proto/hello.proto is unused.

为什么不起作用?

protocol-buffers bazel
1个回答
0
投票

您正在将

hello.proto
文件导入到
outer.proto
中。但是,Protobuf 不支持像 C/C++ 那样的相对导入。您必须使用 WORKSPACE-relative 路径来导入
hello.proto
,或者,如果由于某种原因无法实现,请将
strip_import_prefix
添加到
proto_library
目标。

修改了

src/BUILD
文件以包含
strip_import_prefix

load("@rules_proto//proto:defs.bzl", "proto_library")
proto_library(
   name = "outer_proto",
   srcs = ["outer.proto"],
   deps = ["//proto:hello_proto"],
   strip_import_prefix = "src",
)

在您的

src/outer.proto
文件中,您应该导入
hello.proto
而不带 proto/ 前缀;

syntax = "proto3";
import "hello.proto";
message OuterMessage {
 HelloRequest req = 1;
 HelloReply resp = 2;
}

在这里,我使用

strip_import_prefix
属性从
.proto
文件中的导入路径中删除前缀。在您的情况下,它设置为“src”,这意味着 Bazel 将在
src 目录
中查找 hello.proto 文件,而不是在 proto 目录中。

*该解决方案假设您的 WORKSPACE 文件位于项目的根目录下。如果不是,您可能需要相应地调整 strip_import_prefix 值。

© www.soinside.com 2019 - 2024. All rights reserved.