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?
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"
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;
...
}
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;
}
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.
curl -OL https://github.com/google/protobuf/releases/download/v3.2.0/protoc-3.2.0-linux-x86_64.Zip
décompressez le protocole-3.2.0-linux-x86_64.Zip -d Protocol3
Sudo mv Protocol3/bin/*/usr/local/bin /
Sudo mv Protoc3/include/*/usr/local/include /
Maintenant, vous pouvez simplement utiliser cette commande
protocole -I/usr/local/include -I. --go_out = {output_directory_path} {proto_file_path}
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
.
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.
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