GRPC相对较新,并且在我的原型文件中出现了一个我似乎无法理解的错误。我想使用“ google.protobuf.Timestamp”在消息中发送时间。我似乎无法导入。我在做什么错了?
syntax = "proto3";
import "google/protobuf/timestamp.proto";
service ProfileService {
rpc ConstructProfileStructFromUser (ConstructProfileStructFromUserRequest) returns (ConstructProfileStructFromUserResponse);
}
message ConstructProfileStructFromUserRequest {
string transactionID = 1;
string User = 2;
}
message ConstructProfileStructFromUserResponse {
string UID = 1;
string ContactEmail = 2;
google.protobuf.Timestamp DateOfBirth = 3;
}
在我的IDE和编译器中(使用以下命令),我都会收到错误消息
google/protobuf/timestamp.proto: File not found.
profile.proto: Import "google/protobuf/timestamp.proto" was not found or had errors.
profile.proto:21:5: "google.protobuf.Timestamp" is not defined.
要运行的命令:
protoc -I profile/ profile/profile.proto --go_out=plugins=grpc:profile
协议--version
libprotoc 3.0.0
答案 0 :(得分:1)
我遇到了这个问题-我已经使用apt软件包管理器(ubuntu)安装了protoc编译器,并将protoc编译器放置在/usr/local/bin
之类的地方,protoc默认情况下似乎期望并要求导入包含相对于此.eg的路径/usr/local/bin/includes/*
旁边的/usr/local/bin/protoc
。
要解决此问题,我用apt删除了已安装的版本,并从github页面-https://github.com/protocolbuffers/protobuf/releases(包括inlcude文件夹)下载了最新版本,并按照说明进行了放置。
答案 1 :(得分:0)
我的问题很简单...
我没有在本地下载timestamp.proto,因此找不到它。
我克隆了:
https://github.com/protocolbuffers/protobuf/tree/master/src/google/protobuf
然后,当我运行编译器时,必须给它提供定位timestamp.proto文件的位置。
对我来说是...
protoc -I profile/ -I MY_CLONED_REPO_LOCATION/protobuf/src profile/profile.proto --go_out=plugins=grpc:profile
一旦知道了到源的路径,便可以毫无问题地找到它。
答案 2 :(得分:0)
我从ubuntu repo安装的协议3.0.0遇到了同样的问题。我发现了另一个解决方案,而没有使用--proto_path protoc选项按照@SwiftD的建议重新安装protobuf。 在您的.proto导入中应该看起来像(即没有路径):
syntax = "proto3";
import "timestamp.proto"
然后在协议调用中,使用--proto_path选项将绝对路径传递到包含timestamp.proto(我使用github.com/golang/protobuf/ptypes/timestamp)的包目录。
protoc kcproto.proto --go_out=./ --proto_path=/home/my_home_dir_name/go/src/github.com/golang/protobuf/ptypes/timestamp --proto_path=./
用go软件包目录替换/ home / my_home_dir_name /
答案 3 :(得分:0)
对于Mac,我在终端中运行
PROTOC_ZIP=protoc-3.14.0-osx-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP
请注意,您可以根据需要更改版本protoc-3.14.0
,例如protoc-3.x.x
文档:http://google.github.io/proto-lens/installing-protoc.html
答案 4 :(得分:-1)
在同样的情况下我最终做的是包括
message google {
message protobuf {
message Timestamp {
int64 seconds = 1;
int32 nanos = 2;
}
}
}
在我的原型文件中。这足以让它被识别为众所周知的类型,所以在 python 中我得到了 https://developers.google.com/protocol-buffers/docs/reference/python-generated#timestamp 中描述的附加 API。
主要优点是我们都可以继续使用 protoc
的系统安装,而不必从源代码安装。