2017-06-28 10 views
0

他のプロト定義をインポートするときに見つからないディレクトリで失敗し、私はGradleのタスクとして、いくつかのいるProtobuf定義をコンパイルしようとしているが、ソースなしの世代と次のエラーを取得しています:gRPCのGradleの:generateProtoが

* 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プラグインは、io.grpc..のバージョンではなく、Vert.xの成果物を使用していることに注意してください(実際はその上にあるラッパーです)。私はio.grpcバージョンのVert.xバージョンを交換しようとしましたが、同じエラーが発生します。インポートするときに、私は必要な定義がすべてあることを考えると、まったくなぜそれが(a)の間違った場所に抽出されたファイルを探して、任意の設定を変更し、かつ(b)は、抽出したファイルを探していませんでした

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" 
    } 
} 

src/main/protoディレクトリにありますか?

+0

完全なソースは、私の[GitHubのレポ](https://github.com/AshleyByeUK/grpc)で入手可能です明快さを提供したり、問題を再現することができます。 – amb85

答えて

0

さて、ずっと頭のスクラッチ後、手掛かりは、エラーメッセージの最後の2行にあった:私のプロト定義で

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

、私はmessagesパッケージであることをmessagesemptyを指定していたが、HADN 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); 
}