¿Cómo build buffers de protocolo de Google y Kotlin usando Gradle?

Intento crear un proyecto que use ambos buffers de protocolo de Google y Kotlin usando Gradle. Quiero que los files proto se compilen en una fuente Java, que luego se llama desde mi código Kotlin.

Mis files de origen están dispuestos de esta manera:

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

Aquí está mi file 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' } 

Cuando ejecuto ./gradlew assemble obtengo un montón de errores de "reference no resuelta" durante :compileKotlin . Después puedo ver que no hay files fuente Java generados, por lo que parece que el comstackdor proto no se está invocando en absoluto.

Si apply plugin: 'kotlin' , entonces ./gradlew assemble genera con éxito el origen de Java, pero por supuesto mi fuente de Kotlin nunca se comstack.

¿Cómo arreglo mi build.gradle para que pueda llamar a mi código protobuf de Kotlin?

Pude hacer que esto funcionara al agregar dos líneas a mi build.gradle.

La primera línea agrega el directory en el que el comstackdor de proto genera código Java a los directorys :compileKotlin busca el origen de Java:

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

El segundo asegura que el código de Java se (re) genera antes de invocar :compileKotlin :

 compileKotlin.dependsOn ':generateProto' 

Para Kotlin y Android:

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

Se debe agregar un directory de origen adicional para cada tipo de compilation. En este ejemplo, hay dos types de compilation: debug y release .

Si está utilizando grpc, se debe agregar otra línea por tipo de compilation:

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

Al less con Kotlin 1.0.6, protobuf-gradle-plugin 0.8.0, protobuf 3.2.x y grpc 1.x no es necesario manipular el order de las tareas.

si está trabajando con múltiples types de compilation y sabores en Android y con protobuf-lite, use a continuación con kotlin.

por ejemplo, tengo comstackciones de debug y release con demo y prod demo que crearán las demoDebug , demoRelease y prodDebug y prodRelease .

luego usa

`

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

`

atar los diferentes compileKotlin con 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') }