web-dev-qa-db-ja.com

gRPCで事前定義されたprotobufタイプ(「google / protobuf / timestamp.proto」)を使用する方法

GRPCプラグインとGoでgoogle/protobuf/timestamp.protoを使用しようとしています。これが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.

何か不足していますか、それともまだサポートされていませんか?

14
Adrian

まだ完全にはサポートされていませんが、変更することで機能させることができます

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

生成されたファイルのインポートを修正する

import google_protobuf "google/protobuf/timestamp.pb"

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

/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;
    ...
}
8
Seonggi Yang

私の場合、問題は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;
}
5
Dzintars

何時間も頭を掻いた後、問題が見つかりました。

私の/ usr/local/includeディレクトリには/ google/protobufファイルがありません。これがないと、事前定義されたタイプを使用できません。この問題を解決するには。

これで、このコマンドを簡単に使用できます

protoc -I/usr/local/include -I。 --go_out = {output_directory_path} {proto_file_path}

1
mourya venkat

アルパインDockerイメージ内でこれに直面している場合は、apk add protobuf-devprotocを使用してファイルを生成する前。

1
BKC

Go grpcプラグインにMgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestampオプションを渡すことで問題を回避しています。

つまり、私は

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

それは少しハックです。 「幸いにも」私はすでにビルド設定で多くのMprotofile=go/pkg/import/pathパラメータを使用しているため、簡単に追加できました。

0
distributed

Windowsでは、リポジトリのクローンを作成します: protobuf

そして、コマンドを実行します

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