【问题标题】:How to generate Go gRPC code with the protobuf-gradle-plugin?如何使用 protobuf-gradle-plugin 生成 Go gRPC 代码?
【发布时间】:2021-04-24 04:21:14
【问题描述】:

这个问题与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 做了类似的事情,并且预计还会有一个helloworld_grpc.pb.go 由带有gRPC 服务器和客户端存根的Go Protobuf 插件生成。如何让 Gradle 生成此代码?

【问题讨论】:

    标签: gradle protocol-buffers grpc grpc-java grpc-go


    【解决方案1】:

    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' 的引号)。

    另外请注意,Gradle 编译任务不会自动获取生成的 Go 代码,您需要自己连接(类似于 Java 的 sourceSets 块中的 srcDirs 'build/generated/source/proto/main/grpc',但我不这样做'不知道 Gradle 是如何用于构建 Go 项目的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 2020-10-02
      • 2021-04-19
      • 2018-11-14
      • 2016-02-19
      • 2021-09-13
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多