Как создать буферы протокола Google и Kotlin с использованием Gradle?

Я пытаюсь построить проект, который использует как буферы протокола Google, так и Kotlin, используя Gradle. Я хочу, чтобы прото-файлы компилировались в источник Java, который затем вызывается из моего кода Kotlin.

Мои исходные файлы расположены следующим образом:

src/main/proto/*.proto src/main/kotlin/*.kt src/test/kotlin/*.kt 

Вот мой файл build.gradle :

 version '1.0-SNAPSHOT' apply plugin: 'kotlin' apply plugin: 'java' apply plugin: 'com.google.protobuf' repositories { mavenCentral() maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.1" } } buildscript { ext.kotlin_version = '1.1-M02' repositories { mavenCentral() maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.1" } } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0' } } dependencies { compile 'com.google.protobuf:protobuf-java:3.0.0' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testCompile 'junit:junit:4.12' } 

Когда я запускаю ./gradlew assemble я получаю кучу ошибок «Unresolved reference» во время :compileKotlin . Впоследствии я вижу, что нет исходных файлов Java, поэтому кажется, что прото-компилятор вообще не вызывается.

Если я apply plugin: 'kotlin' , то ./gradlew assemble успешно генерирует источник Java, но, конечно, мой источник Kotlin никогда не компилируется.

Как исправить мой build.gradle чтобы я мог позвонить своему протобуф-коду из Котлина?

    Я смог заставить это работать, добавив две строки в мой build.gradle.

    Первая строка добавляет каталог, в котором прото-компилятор генерирует код Java в каталоги :compileKotlin ищет источник Java:

     sourceSets.main.java.srcDirs += 'build/generated/source/proto/main/java' 

    Второй гарантирует, что Java-код (re) сгенерирован перед :compileKotlin : :compileKotlin :

     compileKotlin.dependsOn ':generateProto' 

    Для Kotlin и Android:

     android { sourceSets { debug.java.srcDirs += 'build/generated/source/proto/debug/java' release.java.srcDirs += 'build/generated/source/proto/release/java' } } 

    Для каждого типа сборки необходимо добавить дополнительный исходный каталог. В этом примере есть два типа сборки: debug и release .

    Если вы используете grpc, в каждый тип сборки должна быть добавлена ​​другая строка:

     android { sourceSets { debug.java.srcDirs += 'build/generated/source/proto/debug/java' debug.java.srcDirs += 'build/generated/source/proto/debug/grpc' release.java.srcDirs += 'build/generated/source/proto/release/java' release.java.srcDirs += 'build/generated/source/proto/release/grpc' } } 

    По крайней мере, с Kotlin 1.0.6, protobuf-gradle-plugin 0.8.0, protobuf 3.2.x и grpc 1.x не требуется возиться с порядком задания.

    если вы работаете с несколькими типами сборки и ароматами в android и используете protobuf-lite ниже с kotlin.

    например, у меня есть debug и release сборки с demo и prod demoDebug , это создаст demoDebug , demoRelease и prodDebug и варианты prodRelease .

    затем используйте

    `

     android{ sourceSets { debug.java.srcDirs += 'build/generated/source/proto/demoDebug/javalite' debug.java.srcDirs += 'build/generated/source/proto/prodDebug/javalite' release.java.srcDirs += 'build/generated/source/proto/demoRelease/javalite' release.java.srcDirs += 'build/generated/source/proto/prodRelease/javalite' } } 

    `

    связать другой компиляторKotlin с generateProto

     tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { if (getName() == 'compileDemoDebugKotlin') dependsOn(':app:generateDemoDebugProto') if (getName() == 'compileDemoReleaseKotlin') dependsOn(':app:generateDemoReleaseProto') if (getName() == 'compileProdDebugKotlin') dependsOn(':app:generateProdDebugProto') if (getName() == 'compileProdReleaseKotlin') dependsOn(':app:generateProdReleaseProto') } 
    Intereting Posts
    использование intellij-markdown в проекте kotlin android Kotlin: как преобразовать тест, который использует Thread.sleep для RxJava TestScheduler Джессинская десериализация Kotlin JS Равный оператор не может применяться между примитивной и коробчатой ​​переменной Как сортировать Kotlin MutableList <Int> Это плохая практика поиска данных в списке по индексу несколько раз? Как объединить 2 отдельных потока, буферизовать заполненные данные из них и subsrcibe к нему после некоторого времени Запрос андроидов КонтактыКонтракт в Котлине Как я могу прочитать уникальный ключ, предоставленный firebase? Переопределить аннотацию @JsonIgnore для некоторых контроллеров. Джексон. весна Java vs Kotlin generics Инструментальные тесты не могут выполняться в библиотечных модулях Android с файлами Kotlin RxJava-Turn, наблюдаемый в Iterator, Stream или Sequence Как скрыть навигационную панель андроида или квадратную кнопку в навигационной панели Ожидаемый Int, вместо этого получил IntProgression