2016-11-09 20 views
10

Próbuję zbudować projekt, który używa zarówno buforów protokołu Google i Kotlin za pomocą Gradle. Chcę, aby pliki proto zostały skompilowane do źródła Java, które jest następnie wywoływane z mojego kodu Kotlin.Jak zbudować bufory protokołu Google i Kotlin za pomocą Gradle?

Moje pliki źródłowe są ułożone tak:

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

Oto mój build.gradle file:

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

Kiedy biegnę ./gradlew assemble mam kilka "Nierozwiązane odniesienia" błędy podczas :compileKotlin. Potem widzę, że nie ma generowanych plików źródłowych Java, więc wygląda na to, że kompilator proto nie jest w ogóle wywoływany.

Po usunięciu linii apply plugin: 'kotlin', ./gradlew assemble z powodzeniem generuje źródło Java, ale oczywiście moje źródło Kotlin nigdy nie jest kompilowane.

Jak naprawić swój build.gradle, aby móc wywoływać mój kod protobuf z Kotlin?

Odpowiedz

10

Udało mi się uruchomić to, dodając dwa wiersze do mojego build.gradle.

Pierwsza linia dodaje katalog, w którym kompilator proto generuje kod Java do folderu :compileKotlin szuka źródła Java:

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

Drugi zapewnia, że ​​kod Java jest (re) generowanych przed wywołaniem :compileKotlin :

compileKotlin.dependsOn ':generateProto' 
+2

Jedna drobna uwaga: można zmienić ścieżkę w pierwszym etapie do ' "$ {protobuf.generatedFilesBaseDir}/main/java" 'automatycznie wybiera zmienne foldery. –

5

Na Kotlin i Android:

android { 

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

Dodatkowy katalog źródłowy musi zostać dodany dla każdego typu kompilacji. W tym przykładzie są dwa typy kompilacji: debug i release.

Jeśli używasz grpc kolejna linia ma być dodany od rodzaju produkcji:

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

przynajmniej Kotlin 1.0.6, protobuf Gradle-plugin 0.8.0, 3.2.x oraz Protobuf grpc 1.x nie jest wymagane manipulowanie kolejnością zadań.

0

jeśli pracujesz z wieloma rodzajami kompilacji i smakami w Androidzie oraz z użyciem protobuf-lite poniżej z kotliną.

na przykład mam debug i release buduje z demo i prod smakach stworzy demoDebug, demoRelease i prodDebug i prodRelease warianty.

następnie użyć

`

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

`

związać inny compileKotlin z 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') 
} 
Powiązane problemy