【发布时间】:2017-08-14 12:14:18
【问题描述】:
我有一个简单的 gradle 脚本(只是在我的 Gradle 任务运行时记录)
class TestScriptTask extends DefaultTask {
@TaskAction
def testScript() {
logger.quiet("My Gradle Task Here")
}
}
project(":app") {
task testScript(type: TestScriptTask) {
}
}
我有一个简单的 Android 项目“app”,它依赖于 Kotlin 中的模块“remotelib”。
我的应用的 build.gradle 依赖如下
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':remotelib')
// and others
}
所以当我按如下方式运行我的 gradle 任务时
./gradlew :app:assembleRelease :app:testScript
脚本运行如下(注意这里的任务是先执行的)
> Task :app:testScript
My Gradle Task Here
> Task :remotelib:compileReleaseKotlin
Using kotlin incremental compilation
这只发生在使用'com.android.tools.build:gradle:3.0.0-beta1'(以及beta2)开始。
当我在'com.android.tools.build:gradle:2.3.2' 时,顺序没问题,正如预期的那样,即
> Task :remotelib:compileReleaseKotlin
Using kotlin incremental compilation
> Task :app:testScript
My Gradle Task Here
这是 gradle 3.0.0 的 bug,还是处理任务顺序的新方法?
更新
我的项目范围 build.gradle 如下
buildscript {
ext.kotlin_version = '1.1.2-4'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-beta1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply from: 'test_script.gradle'
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
【问题讨论】:
-
Android Gradle 插件 3.0.0 及其与 Kotlin 插件的互操作有很多变化,这些变化可能还包括一些影响任务排序的变化。但是,在您的示例中,您没有指定(至少在此处发布的代码中)您的
:app:testScript任务依赖于remotelib中的 Kotlin 编译。它可以通过dependsOn关系或使用app的compile配置作为testScript任务的输入来完成。否则,这两个任务之间的执行顺序是不确定的,它们可以以任意顺序运行。 -
谢谢@hotkey。你能告诉我如何制作
:app:testScript task depends on Kotlin compilation in remotelib吗?谢谢。 -
不客气。我已经在答案中描述了如何做到这一点。
标签: android gradle android-gradle-plugin kotlin android-studio-3.0