web-dev-qa-db-fra.com

Comment utiliser le type de protobuf prédéfini (c'est-à-dire "google / protobuf / timestamp.proto") avec gRPC

J'essaie d'utiliser google/protobuf/timestamp.proto avec le plugin gRPC et Go. Voici comment je lance protoc:

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

Et voici mon .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;
    ...
}

Je vois les erreurs suivantes:

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

Suis-je en train de manquer quelque chose ou ce n'est pas encore pris en charge?

14
Adrian

Il n'est pas encore entièrement pris en charge, mais vous pouvez le faire fonctionner en modifiant

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

et en corrigeant l'importation des fichiers générés

import google_protobuf "google/protobuf/timestamp.pb"

à

import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
5
Marcel Novy

Ajouter /usr/local/include pour inclure les chemins à utiliser /usr/local/include/google/api/timestamp.proto:

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

Comme vous pouvez le voir dans timestamp.proto, Timestamp existe dans le package google.protobuf, vous devez donc modifier pour utiliser Timestamp comme ceci:

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

Dans mon cas, le problème était dans ma configuration de Fedora 29.

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

C'était ma mauvaise configuration. Je l'ai donc corrigé avec les étapes suivantes. Faites également attention aux lignes de commande grisées.

# 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

Après cela, je peux utiliser:

import "google/protobuf/timestamp.proto";

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

Après m'être gratté la tête pendant des heures, j'ai trouvé le problème.

Mon répertoire/usr/local/include n'a pas de fichiers/google/protobuf et sans cela, il ne peut pas utiliser de types prédéfinis. Pour résoudre ce problème.

Maintenant, vous pouvez simplement utiliser cette commande

protocole -I/usr/local/include -I. --go_out = {output_directory_path} {proto_file_path}

1
mourya venkat

Si vous êtes face à cela dans une image de docker Alpine, assurez-vous de faire un apk add protobuf-dev avant de générer vos fichiers à l'aide de protoc.

1
BKC

Je contourne le problème en passant un Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp option du plugin Go grpc.

En d'autres termes, j'appelle

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

C'est un peu un hack. "Heureusement" j'utilise déjà beaucoup de Mprotofile=go/pkg/import/path paramètres dans ma configuration de construction, donc c'était facile à ajouter.

0
distributed

Dans Windows, clonez le référentiel: protobuf .

Et exécutez la commande

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