【问题标题】:Gradle 3.0.0 (in Android Studio 3.0) reorder the tasks sequence (when compile with Kotlin module)?Gradle 3.0.0(在 Android Studio 3.0 中)重新排序任务序列(使用 Kotlin 模块编译时)?
【发布时间】: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 关系或使用appcompile 配置作为testScript 任务的输入来完成。否则,这两个任务之间的执行顺序是不确定的,它们可以以任意顺序运行。
  • 谢谢@hotkey。你能告诉我如何制作:app:testScript task depends on Kotlin compilation in remotelib吗?谢谢。
  • 不客气。我已经在答案中描述了如何做到这一点。

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


【解决方案1】:

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

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

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

  • testScript.dependsOn configurations.compile

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

  • testScript.dependsOn project(':remotelib').compileKotlin

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

【讨论】:

  • 以上TestScriptTask 都驻留在文件test_script.gradle 中。在项目build.gradle 中,我调用apply from: 'test_script.gradle'。我尝试在应用程序build.gradle 甚至test_script.gradle 中应用您的建议testScript.dependsOn configurations.compile...但不断出错。我应该把你的提议脚本放在哪里?
  • @Elye,您遇到的错误是什么?基本上,我在答案中建议的任一解决方案都应该在创建testScript 任务之后应用。即在build.gradle 中的apply from: ... 之后或test_script.gradle 中的任务定义之后。
  • 我收到此错误Could not get unknown property 'testScript' for root project 'MyApplication' of type org.gradle.api.Project. 我将其添加到apply from: 'test_script.gradle' 行之后,如上面的更新所示。
  • 实际上,您可以将我建议的任一行包装到 afterEvaluate { ... } 块中,使其仅在评估构建脚本后运行。您收到的错误告诉您,在执行该行时,尚未创建任务 testScript。所以,你需要稍后执行它。
  • 我已将它放在我的test_script.gradleproject(":app") 范围内。我可以毫无问题地做./gradlew clean。但是当运行./gradlew assemble 时,会出现Could not determine the dependencies of task ':app:testScript'. Could not resolve all task dependencies for configuration ':app:compile'. Could not resolve project :remotelib.... 错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多