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

标签 android gradle android-gradle-plugin 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 的 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 编译>。因此这两个任务之间的执行顺序是不确定的,它们可以按任意顺序运行。

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

  • testScript.dependsOnconfigurations.compile

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

  • testScript.dependsOn 项目(':remotelib').compileKotlin

    这明确指定该任务依赖于 :remotelib:compileKotlin,但它要求 :remotelib:app 之前评估(您可能需要将 evaluationDependsOn ':remotelib' 行添加到 :app 的构建脚本中)。

关于android - Gradle 3.0.0(在 Android Studio 3.0 中)重新排序任务序列(使用 Kotlin 模块编译时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45674313/

相关文章:

android - Jetpack Compose LazyColumn 反向展示

android - 如何撤消/重做上次触摸操作

selenium - Allure 是否支持Bitbucket管道?

java - 将 Gradle 支持添加到 IntelliJ 项目的最佳方式

android - 当我对其应用 crashlytics 时应用程序崩溃

android - Android 上的 Mupdf 内存泄漏

gradle - 为什么这是依赖冲突或如何解决它?

android - 在应用程序中找不到传递库依赖项

Android Gradle Sync 同步项目失败

android - 如何在Android中使用p12证书(客户端证书)