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-grp. > а они у меня в $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"
    }
}

Я не менял никаких настроек, почему он (а) ищет извлеченные файлы в неправильном месте и (б) вообще ищет извлеченные файлы при импорте, учитывая, что все необходимые определения находятся в каталоге src/main/proto?


person amb85    schedule 28.06.2017    source источник
comment
Полный исходный код доступен в моем репозитории GitHub, если это помогает внести ясность или воспроизвести проблему.   -  person amb85    schedule 28.06.2017


Ответы (1)


Хорошо, после долгой царапины в голове подсказка была в последних двух строках сообщения об ошибке:

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);
}

Становится:

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