Как использовать предопределенный тип 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}