Gradle 3.0.0(在Android Studio 3.0中)重新排序任务序列(使用Kotlin模块编译时)?

时间:2017-08-14 12:14:19

标签: android gradle android-gradle kotlin android-studio-3.0

我有一个简单的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错误,还是处理任务订单的新方法?

更新

我的项目范围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

}

1 个答案:

答案 0 :(得分:2)

Android Gradle插件3.0.0及其与Kotlin插件的互操作有很多变化,这些变化可能还包括一些影响任务排序的变化。

但是,在您的示例中,您没有指定(至少在此处发布的代码中):app:testScript任务依赖于:remotelib中的Kotlin编译。因此,这两个任务之间的执行顺序是未定义的,它们可以以任意顺序运行。

这可以通过以下方式之一完成:

  • testScript.dependsOn configurations.compile

    由于您已将compile project(':remotelib')添加到app的依赖项,因此testScript依赖于configurations.compile也会触发项目中{{1}的默认配置的构建因此也在其中编译Kotlin。

  • :remotelib

    这明确指明任务取决于testScript.dependsOn project(':remotelib').compileKotlin,但需要在:remotelib:compileKotlin之前评估:remotelib(您可能需要将:app行添加到{ {1}}的构建脚本)。