如何使用Gradle构建Google协议缓冲区和Kotlin?

问题描述:

我试图建立一个项目,使用谷歌协议缓冲区和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代码?

我能够通过添加两行到我的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”'自动选择更改的文件夹。 –

对于科特林和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不需要摆弄任务订单。

如果您在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') 
}