gRPC gradle:generateProto失败,导入其他原型定义时找不到目录

时间:2017-06-28 16:55:50

标签: gradle vert.x grpc-java

我正在尝试将一些protobuf定义编译为gradle任务,但是在没有源代码的情况下会出现以下错误:

* What went wrong:
Execution failed for task ':generateProto'.
> protoc: stdout: . stderr: /Users/ash/IdeaProjects/kotlin/grpc/build/extracted-protos/main: warning: directory does not exist.
  service-definitions.proto:10:17: "Empty" is not defined.
  service-definitions.proto:10:33: "Empty" is not defined.
  service-definitions.proto:15:17: "SimpleRequest" is not defined.
  service-definitions.proto:15:41: "SimpleResponse" is not defined.
  service-definitions.proto:21:27: "StreamingOutputCallRequest" is not defined.
  service-definitions.proto:21:71: "StreamingOutputCallResponse" is not defined.
  service-definitions.proto:27:33: "StreamingInputCallRequest" is not defined.
  service-definitions.proto:27:69: "StreamingInputCallResponse" is not defined.
  service-definitions.proto:34:29: "StreamingOutputCallRequest" is not defined.
  service-definitions.proto:34:73: "StreamingOutputCallResponse" is not defined.
  service-definitions.proto: warning: Import empty.proto but not used.
  service-definitions.proto: warning: Import messages.proto but not used.

仅当我尝试编译导入其他定义的定义时才会发生这种情况。如果我删除service-definitions.proto定义,则会生成其他编译和源。

protobuf定义可从vertx-grpc examples获得,我将它们放在$projectDir/src/main/proto中。我没有更改其默认构建位置,因此生成的源代码为$projectDir/build/generated/source/proto。但是,我没有extracted-protos目录,而是extracted-include-protos(可能解释了找不到目录的错误)。

这是我的gradle.build文件,如果有用的话。请注意,gRPC插件使用Vert.x工件而不是io.grpc..中的版本(它实际上只是顶部的包装器)。我已经尝试将Vert.x版本换成io.grpc版本并获得相同的错误。

group 'grpc'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.1.3'

    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.1"
    }
}

apply plugin: 'kotlin'
apply plugin: "java"
apply plugin: "com.google.protobuf"
apply plugin: "idea"

protobuf {
    //generatedFilesBaseDir = "$projectDir/build/generated/source/proto"
    protoc {
        artifact = "com.google.protobuf:protoc:3.3.0"
    }
    plugins {
        grpc {
            artifact = "io.vertx:protoc-gen-grpc-java:1.3.0"
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                grpc {}
            }
        }
    }
}

clean {
    delete protobuf.generatedFilesBaseDir
}

idea {
    module {
        sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java")
        sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/grpc")
    }
}

sourceSets {
    main {
        java {
            srcDirs += "${protobuf.generatedFilesBaseDir}/main/java"
            srcDirs += "${protobuf.generatedFilesBaseDir}/main/grpc"
        }
    }
}

repositories {
    jcenter()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "io.vertx:vertx-core:3.4.2"
    compile "io.vertx:vertx-web:3.4.2"
    compile "io.vertx:vertx-grpc:3.4.2"
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
        apiVersion = "1.1"
        languageVersion = "1.1"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
        apiVersion = "1.1"
        languageVersion = "1.1"
    }
}

我没有改变任何设置,为什么它(a)在错误的位置寻找提取的文件,以及(b)在导入时根本寻找提取的文件,因为必要的定义全部在{{ 1}}目录?

1 个答案:

答案 0 :(得分:0)

好的,经过多次抓挠后,线索出现在错误信息的最后两行:

{1,2,3,10,8,6,7,4}

在我的原型定义中,我已将service-definitions.proto: warning: Import empty.proto but not used. service-definitions.proto: warning: Import messages.proto but not used. messages指定为empty包,但在导入定义中使用时未对这些类型进行限定,在messages包中。唉,一个简单的改变,它的工作原理:

services

变为:

package services;
service EmptyPingPongService {
  // One empty request followed by one empty response.
  rpc EmptyCall(Empty) returns (Empty);
}