Как использовать предопределенный тип protobuf (то есть "google/protobuf/timestamp.proto") с 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.
Я что-то упустил или это еще не поддерживается?
Ответы
Ответ 1
Он еще не полностью поддерживается, но вы можете заставить его работать, изменив
message Foo {
google.protobuf.Timestamp modifiedTime = 1;
...
}
и путем фиксации сгенерированного импорта файла
import google_protobuf "google/protobuf/timestamp.pb"
к
import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
Ответ 2
Добавьте /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;
...
}
Ответ 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;
}
Ответ 4
Я работаю над проблемой, передав параметр 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
в моей установке сборки, поэтому ее было легко добавить.
Ответ 5
Если вы сталкиваетесь с этим в образе альпийского докера, убедитесь, что вы сделали apk add protobuf-dev
прежде чем генерировать ваши файлы с помощью protoc
.
Ответ 6
В Windows клонируйте репозиторий:protobuf.
И выполните команду
protoc -I=$SRC_DIR -I=$YOUR_CLONE_LOCATION/protobuf/src --go_out=$DST_DIR $SRC_DIR/$SRC_FILE
Ответ 7
После нескольких часов чесания головы я нашел проблему.
В моем каталоге /usr/local/include нет файлов /google/protobuf, и без этого нельзя использовать предопределенные типы. Чтобы решить эту проблему.
Теперь вы можете просто использовать эту команду
protoc -I/usr/local/include -I. --go_out = {output_directory_path} {proto_file_path}