如何在golang中使用带有grpc的预定义protobuf类型(即“google / protobuf / timestamp.proto”)

时间:2016-10-13 15:50:32

标签: go protocol-buffers grpc

我正在尝试将google/protobuf/timestamp.proto用于gRPC插件和Golang。这就是我运行protoc

的方式
protoc -I  ./   ./*.proto --go_out=plugins=grpc:.

这是我的.proto

#domain.proto
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.viant.xyz";
option java_outer_classname = "domain";

import "google/protobuf/timestamp.proto";

message Foo {
    Timestamp modifiedTime = 1;
    ...
}

我看到以下错误:

domain.proto: Import "google/protobuf/timestamp.proto" was not found or had errors.
domain.proto:44:5: "Timestamp" is not defined.

我错过了什么,或者还没有支持?

7 个答案:

答案 0 :(得分:8)

添加/usr/local/include以包含使用/usr/local/include/google/api/timestamp.proto的路径:

protoc -I/usr/local/include -I. --go_out=plugins=grpc:. *.proto

正如您在timestamp.proto中看到的那样,Timestamp包含google.protobuf,因此您必须修改为使用Timestamp,如下所示:

message Foo {
    google.protobuf.Timestamp modifiedTime = 1;
    ...
}

答案 1 :(得分:5)

它还没有得到完全支持,但您可以通过更改

来使其工作
message Foo {
    google.protobuf.Timestamp modifiedTime = 1;
    ...
}

并修复生成的文件导入

import google_protobuf "google/protobuf/timestamp.pb"

import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"

答案 2 :(得分:3)

就我而言,问题出在我的Fedora 29安装程序中。

# Install Protoc compiler. By default it is 3.5.0 version
sudo dnf -y install protoc

这是我的错误设置。所以我按照以下步骤修复了它。也要注意命令行变灰。

# Uninstall old 3.5.0 version
sudo dnf remove protobuf

# Make sure you grab the latest version
curl -OL  
https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip
# Unzip
unzip protoc-3.6.1-linux-x86_64.zip -d protoc3
# Move protoc to /usr/local/bin/
sudo mv protoc3/bin/* /usr/local/bin/
# Move protoc3/include to /usr/local/include/
sudo mv protoc3/include/* /usr/local/include/
# Optional: change owner
sudo chown $USER /usr/local/bin/protoc
sudo chown -R $USER /usr/local/include/google

在此之后,我可以使用:

import "google/protobuf/timestamp.proto";

message Session {
    google.protobuf.Timestamp create_time = 1;
}

答案 3 :(得分:0)

我通过将Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp选项传递给Go grpc插件来解决此问题。

换句话说,我正在打电话

protoc --go_out=plugins=grpc,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp:outputdir input.proto

这有点像黑客。 “幸运的是”我在构建设置中已经使用了很多Mprotofile=go/pkg/import/path个参数,因此很容易添加。

答案 4 :(得分:0)

如果您是在高山docker映像中面对此问题,请确保先执行apk add protobuf-dev,然后再使用protoc生成文件。

答案 5 :(得分:0)

在Windows中,克隆存储库:protobuf

并运行命令

protoc -I=$SRC_DIR -I=$YOUR_CLONE_LOCATION/protobuf/src --go_out=$DST_DIR $SRC_DIR/$SRC_FILE

答案 6 :(得分:0)

ing了几个小时后,我发现了问题所在。

我的/ usr / local / include目录没有/ google / protobuf文件,没有它就不能使用预定义的类型。为了解决这个问题。

现在您可以简单地使用此命令

协议-I / usr / local / include -I。 --go_out = {output_directory_path} {proto_file_path}