未找到 Protobuf 时间戳

mor*_*dew 5 protocol-buffers proto grpc

GRPC 相对较新,并且在我的 proto 文件中出现了一个我似乎无法理解的错误。我想使用“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;
    }
Run Code Online (Sandbox Code Playgroud)

在我的 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.
Run Code Online (Sandbox Code Playgroud)

运行命令:

protoc -I profile/ profile/profile.proto --go_out=plugins=grpc:profile
Run Code Online (Sandbox Code Playgroud)

协议 --version

libprotoc 3.0.0
Run Code Online (Sandbox Code Playgroud)

Swi*_*ftD 13

protoc我在使用 apt 包管理器(Ubuntu)安装编译器后遇到了这个问题,它将protoc编译器放在类似/usr/local/bin.

\n

默认情况下,似乎protoc期望导入存在于include相对于protoc安装目录的路径中。例如:

\n
    \n
  • protoc地点:/usr/local/bin/protoc
  • \n
  • include地点:/usr/local/bin/include/*
  • \n
\n

安装预编译的二进制文件(任何操作系统)

\n

下载如下所示的预编译二进制文件将包含所需的include目录。

\n

来自grpc.io/docs/protoc-installation的说明

\n
    \n
  1. 从github.com/google/protobuf/releases手动下载与您的操作系统和计算机架构相对应的 zip 文件 (protoc--.zip),或使用如下命令获取该文件:
  2. \n
\n
PB_REL="https://github.com/protocolbuffers/protobuf/releases"\ncurl -LO $PB_REL/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将文件解压缩$HOME/.local到您选择的目录下。例如:
  2. \n
\n
unzip protoc-3.15.8-linux-x86_64.zip -d $HOME/.local\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 更新您的环境\xe2\x80\x99s 路径变量以包含 protoc 可执行文件的路径。例如:
  2. \n
\n
export PATH="$PATH:$HOME/.local/bin"\n
Run Code Online (Sandbox Code Playgroud)\n

  • @dapo 首先,您需要卸载任何现有的协议,然后下载后,您希望下载的二进制文件位于您的路径中的某个位置,例如 `/usr/local/bin/protoc` (假设 `/usr/local/bin` 在您的路径中) PATH var) 那么您只需将下载的包含文件夹放在它旁边的同一文件夹中,例如“/usr/local/bin/includes”。现在应该可以在任何位置工作,调用版本标志来确认 (3认同)
  • 我将协议编译器安装到 /usr/local/bin ,但没有复制所需的导入。在我将额外的导入复制到“/usr/local/bin/include”后,这个问题得到了解决。 (2认同)

T -*_*ott 9

如果您使用包管理器安装了 protoc,则只需安装libprotobuf-dev(Ubuntu) 或protobuf-devel(Fedora) 包。

一般来说,您可以在 Ubuntu 上 apt-file find google/protobuf/timestamp.proto 或 Fedora 上 找到文件的包含包dnf repoquery --file "**/google/protobuf/timestamp.proto"(这就是我找到所需包的方法)。其他包管理器可能有类似的命令。


mor*_*dew 2

我的问题很简单...

我没有在本地下载 timestamp.proto,因此找不到它。

我克隆了:

https://github.com/protocolbuffers/protobuf/tree/master/src/google/protobuf
Run Code Online (Sandbox Code Playgroud)

然后,当我运行编译器时,我必须为其提供定位 timestamp.proto 文件的位置。

对我来说这是...

protoc -I profile/ -I MY_CLONED_REPO_LOCATION/protobuf/src profile/profile.proto --go_out=plugins=grpc:profile
Run Code Online (Sandbox Code Playgroud)

一旦它知道哪里有通往源头的路径,那么它就可以毫无问题地找到它。