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); }
- 无法获取任务的未知属性'outputFile':app:packageDebug'
- 如何在kotlin-android编译之前处理重复的类?
- 使用kotlin&greendao的Android Studio 3.0 Proguard将返回ClassLookupException
- 编译Groovy和Kotlin?
- 在使用标准Gradle生命周期插件时声明自定义的“干净”任务是不允许的
- 用gradle设置kotlin项目
- 使用Gradle构建一个与Kotlin-DSL相关的jar
- 将插件升级到3.0.0时出现Gradle构建错误(manifestOutputFile)
- 使用kotlin-spring插件,还是得不到类的打开错误