我的目录结构如下:
├── 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.
为什么不起作用?
您正在将
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
而不带 syntax = "proto3";
import "hello.proto";
message OuterMessage {
HelloRequest req = 1;
HelloReply resp = 2;
}
在这里,我使用
strip_import_prefix
属性从 .proto
文件中的导入路径中删除前缀。在您的情况下,它设置为“src”,这意味着 Bazel 将在 src 目录中查找
hello.proto
文件,而不是在 *该解决方案假设您的 WORKSPACE 文件位于项目的根目录下。如果不是,您可能需要相应地调整 strip_import_prefix 值。