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.
何か不足していますか、それともまだサポートされていませんか?
まだ完全にはサポートされていませんが、変更することで機能させることができます
message Foo {
google.protobuf.Timestamp modifiedTime = 1;
...
}
生成されたファイルのインポートを修正する
import google_protobuf "google/protobuf/timestamp.pb"
に
import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"
/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;
...
}
私の場合、問題は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;
}
何時間も頭を掻いた後、問題が見つかりました。
私の/ usr/local/includeディレクトリには/ google/protobufファイルがありません。これがないと、事前定義されたタイプを使用できません。この問題を解決するには。
curl -OL https://github.com/google/protobuf/releases/download/v3.2.0/protoc-3.2.0-linux-x86_64.Zip
unzip protoc-3.2.0-linux-x86_64.Zip -d protoc3
Sudo mv protoc3/bin/*/usr/local/bin /
Sudo mv protoc3/include/*/usr/local/include /
これで、このコマンドを簡単に使用できます
protoc -I/usr/local/include -I。 --go_out = {output_directory_path} {proto_file_path}
アルパインDockerイメージ内でこれに直面している場合は、apk add protobuf-dev
protoc
を使用してファイルを生成する前。
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
パラメータを使用しているため、簡単に追加できました。
Windowsでは、リポジトリのクローンを作成します: protobuf 。
そして、コマンドを実行します
protoc -I=$SRC_DIR -I=$YOUR_CLONE_LOCATION/protobuf/src --go_out=$DST_DIR $SRC_DIR/$SRC_FILE