如何使用 protobuf-gradle-plugin 生成 Go gRPC 代码?
How to generate Go gRPC code with the protobuf-gradle-plugin?
此问题与此问题相同,How do I use gradle to generate go grpc code?,但由于该问题尚未得到解答,我再次提出。我制作了一个简化的 Gradle 项目,其结构类似于以下内容:
├── build.gradle
└── src
└── main
└── proto
└── helloworld.proto
其中 build.gradle
读取
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.14'
}
}
plugins {
id "com.google.protobuf" version "0.8.14"
id "java"
}
dependencies {
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0'
implementation group: 'io.grpc', name: 'grpc-protobuf', version: '1.35.0'
implementation group: 'io.grpc', name: 'grpc-stub', version: '1.35.0'
compileOnly group: 'org.apache.tomcat', name: 'annotations-api', version: '6.0.53'
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
all().each { task ->
task.builtins {
go {}
}
}
}
}
和 helloworld.proto
取自 gRPC 教程:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
如果我运行 ./gradlew build
,我得到以下生成的源代码:
build/generated/source/
└── proto
└── main
├── go
│ └── helloworld.pb.go
├── grpc
│ └── io
│ └── grpc
│ └── examples
│ └── helloworld
│ └── GreeterGrpc.java
└── java
└── io
└── grpc
└── examples
└── helloworld
├── HelloReply.java
├── HelloReplyOrBuilder.java
├── HelloRequest.java
├── HelloRequestOrBuilder.java
└── HelloWorldProto.java
我直接使用 protoc
做了类似的事情,并且希望 Go Protobuf 插件与 gRPC 服务器和客户端存根一起生成 helloworld_grpc.pb.go
。如何让 Gradle 生成此代码?
gRPC-Go 的 codegen (https://github.com/grpc/grpc-go/tree/master/cmd/protoc-gen-go-grpc) 由 protoc
自动获取,而不是在 --plugin
标志中指定(也许有办法,但我从未尝试过).
首先你需要在 gRPC quickstart 之后安装 protoc-gen-go-grpc
插件。确保插件在 PATH
.
然后对 protoc 内置函数以同样的方式使用 protoc-gen-go-grpc
插件:
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
all().each { task ->
task.builtins {
go {}
'go-grpc' {}
}
}
}
}
(请注意,由于破折号,您需要引用 'go-grpc'
)。
另请注意,生成的 Go 代码不会被 Gradle 编译任务自动获取,您需要自己将其连接起来(类似于 srcDirs 'build/generated/source/proto/main/grpc'
中的 sourceSets
block for Java,但我不知道 Gradle 是如何用于构建 Go 项目的)。
此问题与此问题相同,How do I use gradle to generate go grpc code?,但由于该问题尚未得到解答,我再次提出。我制作了一个简化的 Gradle 项目,其结构类似于以下内容:
├── build.gradle
└── src
└── main
└── proto
└── helloworld.proto
其中 build.gradle
读取
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.14'
}
}
plugins {
id "com.google.protobuf" version "0.8.14"
id "java"
}
dependencies {
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0'
implementation group: 'io.grpc', name: 'grpc-protobuf', version: '1.35.0'
implementation group: 'io.grpc', name: 'grpc-stub', version: '1.35.0'
compileOnly group: 'org.apache.tomcat', name: 'annotations-api', version: '6.0.53'
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
all().each { task ->
task.builtins {
go {}
}
}
}
}
和 helloworld.proto
取自 gRPC 教程:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
如果我运行 ./gradlew build
,我得到以下生成的源代码:
build/generated/source/
└── proto
└── main
├── go
│ └── helloworld.pb.go
├── grpc
│ └── io
│ └── grpc
│ └── examples
│ └── helloworld
│ └── GreeterGrpc.java
└── java
└── io
└── grpc
└── examples
└── helloworld
├── HelloReply.java
├── HelloReplyOrBuilder.java
├── HelloRequest.java
├── HelloRequestOrBuilder.java
└── HelloWorldProto.java
我直接使用 protoc
做了类似的事情,并且希望 Go Protobuf 插件与 gRPC 服务器和客户端存根一起生成 helloworld_grpc.pb.go
。如何让 Gradle 生成此代码?
gRPC-Go 的 codegen (https://github.com/grpc/grpc-go/tree/master/cmd/protoc-gen-go-grpc) 由 protoc
自动获取,而不是在 --plugin
标志中指定(也许有办法,但我从未尝试过).
首先你需要在 gRPC quickstart 之后安装 protoc-gen-go-grpc
插件。确保插件在 PATH
.
然后对 protoc 内置函数以同样的方式使用 protoc-gen-go-grpc
插件:
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
all().each { task ->
task.builtins {
go {}
'go-grpc' {}
}
}
}
}
(请注意,由于破折号,您需要引用 'go-grpc'
)。
另请注意,生成的 Go 代码不会被 Gradle 编译任务自动获取,您需要自己将其连接起来(类似于 srcDirs 'build/generated/source/proto/main/grpc'
中的 sourceSets
block for Java,但我不知道 Gradle 是如何用于构建 Go 项目的)。