如何在 gRPC 中使用预定义的 protobuf 类型(即 "google/protobuf/timestamp.proto")
How to use predifined protobuf type (i.e. "google/protobuf/timestamp.proto") with gRPC
我正在尝试将 google/protobuf/timestamp.proto
与 gRPC 插件和 Go 一起使用。我就是这样 运行 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.
我是不是遗漏了什么,或者这还不受支持?
尚未完全支持,但您可以通过更改
使其工作
message Foo {
google.protobuf.Timestamp modifiedTime = 1;
...
}
并通过修复生成的文件导入
import google_protobuf "google/protobuf/timestamp.pb"
至
import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
添加 /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;
...
}
我通过将 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
这有点坑爹。 "Fortunately" 我已经在构建设置中使用了很多 Mprotofile=go/pkg/import/path
参数,因此很容易添加。
就我而言,问题出在我的 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;
}
如果您在高山 docker 图像中面对此问题,请确保在使用 protoc
.
生成文件之前执行 apk add protobuf-dev
在 windows 中克隆存储库:protobuf.
和运行命令
protoc -I=$SRC_DIR -I=$YOUR_CLONE_LOCATION/protobuf/src --go_out=$DST_DIR $SRC_DIR/$SRC_FILE
摸索了几个小时后,我找到了问题所在。
我的 /usr/local/include 目录没有 /google/protobuf 文件,没有它就不能使用预定义的类型。解决这个问题。
curl -OL https://github.com/google/protobuf/releases/download/v3.2.0/protoc-3.2.0-linux-x86_64.zip
unzip protoc-3.2.0-linux-x86_64.zip -d protoc3
sudo mv protoc3/bin/* /usr/local/bin/
sudo mv protoc3/include/* /usr/local/include/
现在你可以简单地使用这个命令
协议-I/usr/local/include-I。 --go_out= {output_directory_path} {proto_file_path}
我正在尝试将 google/protobuf/timestamp.proto
与 gRPC 插件和 Go 一起使用。我就是这样 运行 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.
我是不是遗漏了什么,或者这还不受支持?
尚未完全支持,但您可以通过更改
使其工作message Foo {
google.protobuf.Timestamp modifiedTime = 1;
...
}
并通过修复生成的文件导入
import google_protobuf "google/protobuf/timestamp.pb"
至
import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
添加 /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;
...
}
我通过将 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
这有点坑爹。 "Fortunately" 我已经在构建设置中使用了很多 Mprotofile=go/pkg/import/path
参数,因此很容易添加。
就我而言,问题出在我的 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;
}
如果您在高山 docker 图像中面对此问题,请确保在使用 protoc
.
apk add protobuf-dev
在 windows 中克隆存储库:protobuf.
和运行命令
protoc -I=$SRC_DIR -I=$YOUR_CLONE_LOCATION/protobuf/src --go_out=$DST_DIR $SRC_DIR/$SRC_FILE
摸索了几个小时后,我找到了问题所在。
我的 /usr/local/include 目录没有 /google/protobuf 文件,没有它就不能使用预定义的类型。解决这个问题。
curl -OL https://github.com/google/protobuf/releases/download/v3.2.0/protoc-3.2.0-linux-x86_64.zip
unzip protoc-3.2.0-linux-x86_64.zip -d protoc3
sudo mv protoc3/bin/* /usr/local/bin/
sudo mv protoc3/include/* /usr/local/include/
现在你可以简单地使用这个命令
协议-I/usr/local/include-I。 --go_out= {output_directory_path} {proto_file_path}