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

问题描述:

我有一个简单的脚本的Gradle(运行我的摇篮任务时只需登录)Gradle 3.0.0(在Android Studio 3.0中)对任务序列进行重新排序(使用Kotlin模块进行编译时)?

class TestScriptTask extends DefaultTask { 
     @TaskAction 
     def testScript() { 
      logger.quiet("My Gradle Task Here") 
     } 
    } 

    project(":app") { 
     task testScript(type: TestScriptTask) { 
     } 
    } 

而且我有一个简单的Android项目,“应用程序”,这是依赖于科特林模块“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 

} 
+0

Android Gradle插件3.0中有很多更改。0以及它与Kotlin插件的互操作,并且这些更改还可能包括一些影响任务排序的部分。然而,在你的例子中,你不指定(至少在这里发布的代码中)你的':app:testScript'任务依赖'remotelib'中的Kotlin编译。它可以通过'dependsOn'关系完成,也可以通过'app'的'compile'配置作为'testScript'任务的输入。否则,这两个任务之间的执行顺序是未定义的,并且它们可以以任意顺序运行。 – hotkey

+0

感谢@hotkey。你能告诉我如何使':app:testScript任务取决于在remotelib中的Kotlin编译吗?谢谢。 – Elye

+0

不客气。我已经描述了如何在答案中做到这一点。 – hotkey

有很多在Android摇篮插件3.0.0的变化及其与科特林插件互操作,以及改变也可能包括一些影响任务排序的部分。

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

这可能是由以下原因之一进行:

  • testScript.dependsOn configurations.compile

    既然你已经添加compile project(':remotelib')app的依赖性,使其testScript取决于configurations.compile也将触发违约的构建在项目:remotelib中配置,因此也在其中编译Kotlin。

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

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

+0

上面的'TestScriptTask'全部驻留在'test_script.gradle'文件中。在'build.gradle'这个项目中,我调用''test_script.gradle''。我尝试在应用程序'build.gradle'中,甚至在'test_script.gradle'中应用你提出的'testScript.dependsOn configurations.compile' ...但是不断收到错误。我应该在哪里放置你的建议脚本? – Elye

+0

@Elye,你得到的错误是什么?基本上,我在回答中提出的解决方案应该在* testScript任务创建后应用。也就是说,在'build.gradle'中应用':'后,或在'test_script.gradle'中的任务定义之后。 – hotkey

+0

我得到这个错误'无法得到类型为org.gradle.api.Project.'的根项目'MyApplication'的未知属性'testScript''我将它添加到''test_script.gradle''的行后面:显示在我上面的更新中。 – Elye