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

我试图编译一些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的例子中找到 ,我把它们放在$projectDir/src/main/proto 。 我没有改变他们的默认构建位置,所以来源被生成到$projectDir/build/generated/source/proto 。 但是,我extracted-include-protos (可能解释目录未找到错误),而不是extracted-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)在导入时查找提取的文件,因为必要的定义全部在src/main/proto目录?

好了,在头脑发热的时候,线索出现在错误信息的最后两行:

 service-definitions.proto: warning: Import empty.proto but not used. service-definitions.proto: warning: Import messages.proto but not used. 

在我的原型定义中,我已经指定了messages并将其置于messages包中,但在导入定义中使用的类型(在services包中)中没有定义。 唉,一个简单的变化,它的工作原理:

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

变为:

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