如何使用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'
对于科特林和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'
}
}
至少在科特林1.0.6,protobuf的-gradle这个-插件0.8.0,protobuf的3.2.x中和grpc 1.x不需要摆弄任务订单。
如果您在Android中使用多种构建类型和风味,并使用kotlin在下面使用protobuf-lite。
,比如我有debug
和release
建立与demo
和prod
口味会造成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'
}
}
`
配合不同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')
}
一个小小的提示:您可以更改在第一步的路径' “$ {protobuf.generatedFilesBaseDir}/main/java”'自动选择更改的文件夹。 –