2016-11-09 114 views
10

我試圖建立一個項目,使用谷歌協議緩衝區和Kotlin使用Gradle。我想將原始文件編譯成Java源代碼,然後從我的Kotlin代碼中調用它。如何使用Gradle構建Google協議緩衝區和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我是否會在:compileKotlin一串 「未解決的參考」 錯誤。之後,我可以看到沒有生成Java源文件,因此似乎根本沒有調用proto編譯器。

如果我刪除apply plugin: 'kotlin'行,然後./gradlew assemble成功生成Java源代碼,但是當然我的Kotlin源代碼從不編譯。

如何修復我的build.gradle以便我可以從Kotlin撥打我的protobuf代碼?

回答

10

我能夠通過添加兩行到我的build.gradle得到這個工作。

第一行增加了其中原編譯器生成Java代碼的目錄的:compileKotlin查找Java源的目錄:調用:compileKotlin之前產生

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

第二確保了Java代碼是(重新) :

compileKotlin.dependsOn ':generateProto' 
+2

一個小小的提示:您可以更改在第一步的路徑' 「$ {protobuf.generatedFilesBaseDir}/main/java」'自動選擇更改的文件夾。 –

5

對於科特林和Android:

android { 

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

必須爲每個構建類型添加額外的源目錄。在這個示例中有兩種構建類型:debugrelease

如果您使用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' 
    } 
} 

至少在科特林1.0.6,protobuf的-gradle這個-插件0.8.0,protobuf的3.2.x中和grpc 1.x不需要擺弄任務訂單。

0

如果您在Android中使用多種構建類型和風味,並使用kotlin在下面使用protobuf-lite。

,比如我有debugrelease建立與demoprod口味會造成demoDebugdemoReleaseprodDebugprodRelease變種。

然後用

`

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

`

配合不同compileKotlin與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') 
}