引用外部原型,如 google/rpc/status.proto

alk*_*ity 5 protocol-buffers

我想知道如何属性引用外部 proto 文件。假设我有一个 .proto 文件,它引用了标准的 protobuf 类型,例如Timestamp

syntax = "proto3";
package api;

import "google/protobuf/timestamp.proto";

message ServerTimeResponse {
  google.protobuf.Timestamp ts = 1;
}
Run Code Online (Sandbox Code Playgroud)

简单。编译时时间戳自动可用。

现在我添加一个外部类型,比如google.rpc.Status

syntax = "proto3";
package api;

import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";

message ServerTimeResponse {
  google.protobuf.Timestamp ts = 1;
  google.rpc.Status status = 2;
}
Run Code Online (Sandbox Code Playgroud)

当然,我们必须告诉protoc如何通过-I/找到该文件所在的位置--proto_path

我的问题是:实际引用此文件的最佳实践是什么,尤其是让版本控制满意?go modprotobufs似乎没有等价物。我已经看到它逐字复制到项目中(例如在grpc-gateway 中)或只是从本地文件系统中引用。

Lan*_*tig 5

我想你在这里回答了你自己的问题。我已经成功完成了这两件事:手动逐字复制必要的文件(来自https://github.com/googleapis/googleapis/tree/master/googlehttps://github.com/protocolbuffers/protobuf/tree/master/ src/google/protobuf),并引用文件的本地副本。

如果您想这样做并让版本控制满意,您可以将这两个存储库添加为存储库中的git 子模块。只需确保将正确的位置传递给protocusing即可-I。例如:

cd $PROJECT_DIR
mkdir third_party && cd third_party
git submodule add https://github.com/googleapis/googleapis/tree/master/google
cd $PROJECT_DIR
<git commit the change>
protoc -I third_party/google <the rest of your protoc command>
Run Code Online (Sandbox Code Playgroud)

至于引用文件的本地副本,并确保它们在尝试构建之前存在,您可能会发现在 Makefile 中添加类似以下内容会有所帮助(这是在 Go 构建环境中):

go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/golang/protobuf/protoc-gen-go
grpc_gateway_path=$(go list -m -f '{{.Dir}}' github.com/grpc-ecosystem/grpc-gateway)
googleapis_path="$grpc_gateway_path/third_party/googleapis"
protoc -I $googleapis_path --go_out=. <list of input files>
Run Code Online (Sandbox Code Playgroud)