Проблема при автоматическом создании файлов-заглушек gRP C с помощью Gradle - PullRequest
1 голос
/ 06 мая 2020

Меня попросили реализовать некоторые классы gRP C для курса колледжа, и я столкнулся с некоторыми проблемами при создании классов java из одного исходного файла прототипа.

Сначала немного предыстории: это довольно базовая c услуга с простым методом, который получает идентификатор и возвращает телефон и электронную почту. Это прототип файла (BuscarData означает FetchData, извините за оставшийся неперевод!):

syntax = 'proto3';
option java_multiple_files=true;
option java_generic_services= true;
package  uy.edu.um.sd20;

message DataRequest {
  int32 id = 1;
}

message DataResponse {
  string phone = 1;
  string email = 2;
}

service DataRepo {
  rpc BuscarData (DataRequest) returns (DataResponse);
}

Моя идея заключалась в том, чтобы сгенерировать классы с помощью плагинов Gradle. Мой build.gradle:

plugins {
    id 'java'
    id "com.google.protobuf" version '0.8.8'
}
apply plugin: 'java'

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.11.4'
    implementation 'io.grpc:grpc-netty-shaded:1.29.0'
    implementation 'io.grpc:grpc-protobuf:1.29.0'
    implementation 'io.grpc:grpc-stub:1.29.0'

}

sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            srcDirs 'src/main/java', 'generated-sources/main/java'
        }
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.11.0'
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.29.0'
        }
    }
    generateProtoTasks.generatedFilesBaseDir = 'generated-sources'

    generateProtoTasks {
        all().each { task ->
            // Here you can configure the task
        }
        ofSourceSet('main')

    }
}

Насколько я понял, все есть: зависимости grp c и proto c, а также плагин, который позволяет proto c компилировать grp c ( proto c -gen-grp c) и куда хранить сгенерированные файлы. Однако есть две проблемы:

  1. сгенерированные источники не помечены как источник или что-то в этом роде, что означает, что они не могут быть импортированы из других классов
  2. , если я не ошибаюсь , сгенерированные источники должны сгенерировать скелет DataRepoImpl, чтобы я мог добавить код, необходимый для BuscarData. Однако этого не произошло. Или, может быть, мне следует создать его, расширяя DataRepo. java, но я не смог его протестировать из-за проблемы № 1.

Я добавил снимок экрана с файловой структурой проекта. : img

Как видите, довольно много (если не все ) настроек градиента скопировано и скопировано со многих различных веб-сайтов. Надеюсь, я был достаточно осторожен, чтобы не повторить импорт. Есть похожие вопросы, и я пробовал их решения, но безуспешно. Один пример, с которым я знал, что мне нужно было включить плагин gen grp c: еще один вопрос SO

Любые подсказки относительно чего-либо еще приветствуются! Я новичок в вопросах, связанных с stackoverflow, поэтому, возможно, я сделал ошибки относительно специфики вопроса или цели вопроса.

Спасибо!

Franri.

1 Ответ

0 голосов
/ 02 июля 2020

Для 1) плагин должен помещать сгенерированные файлы как входные для java задач компиляции, даже если вы явно не добавляете 'generated-sources/main/java' в конфигурацию sourceSets. Версия 0.8.8 вышла давно, вы можете попробовать более новые версии. Возможно, были внесены некоторые незначительные исправления в проблемы, с которыми вы могли столкнуться.

Для 2) вы не добавляли плагин grpc к каждой задаче generateProto. Это должно быть

generateProtoTasks {
    all().each { task ->
        task.plugins { grpc{} }
    }
    ofSourceSet('main')

}
...