找不到Protobuf时间戳记

时间:2019-05-07 22:12:19

标签: protocol-buffers grpc proto

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

5 个答案:

答案 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 的系统安装,而不必从源代码安装。