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

Gradle 3.0.0(在Android Studio 3.0中)重新排序任务序列(使用Kotlin模块编译时)?,android,gradle,android-gradle-plugin,kotlin,android-studio-3.0,Android,Gradle,Android Gradle Plugin,Kotlin,Android Studio 3.0,我有一个简单的gradle脚本(只是在gradle任务运行时记录) 我有一个简单的Android项目“app”,它依赖于Kotlin中的模块“remotelib” 我的应用程序的build.gradle依赖项如下 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':remotelib') // and others } ./gradlew :app:ass

我有一个简单的gradle脚本(只是在gradle任务运行时记录)

我有一个简单的Android项目“app”,它依赖于Kotlin中的模块“remotelib”

我的应用程序的build.gradle依赖项如下

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':remotelib')
    // and others
}
 ./gradlew :app:assembleRelease :app:testScript
因此,当我运行gradle任务时,如下所示

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':remotelib')
    // and others
}
 ./gradlew :app:assembleRelease :app:testScript
脚本按如下方式运行(注意,首先执行此处的任务)

这只会在使用
'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

}

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

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

这可以通过以下方式之一实现:

  • testScript.dependsOn configurations.compile

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

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

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


Android Gradle插件3.0.0及其与Kotlin插件的互操作有很多更改,这些更改可能还包括一些影响任务排序的更改。但是,在您的示例中,您没有指定(至少在这里发布的代码中)您的
:app:testScript
任务依赖于
remotelib
中的Kotlin编译。可以使用
dependsOn
关系或使用
app
compile
配置作为
testScript
任务的输入来完成。否则,这两个任务之间的执行顺序是未定义的,它们可以以任意顺序运行。谢谢@hotkey。你能告诉我如何使
:app:testScript任务依赖于remotelib中的Kotlin编译吗?谢谢,不客气。我已经在回答中描述了如何完成它。上面的
TestScriptTask
都驻留在一个文件
test\u script.gradle
中。在项目
build.gradle
中,我调用
apply from:'test\u script.gradle'
。我尝试在app
build.gradle
中,甚至在
test\u script.gradle
中,应用您的建议
testScript.dependsOn配置。。。但是不断地出错。我应该把你的求婚脚本放在哪里?@Elye,你犯了什么错误?基本上,我在回答中建议的任何一种解决方案都应该在创建
testScript
任务之后应用。也就是说,在
应用于之后:
build.gradle
中,或在
test\u script.gradle
中的任务定义之后。我收到此错误
无法为org.gradle.api.project类型的根项目“MyApplication”获取未知属性“testScript”。
我将其添加到
apply from:“test\u script.gradle”
的行之后,如更新中所示实际上,您可以将我建议的任何一行包装到
afterEvaluate{…}
块中,使其仅在对构建脚本求值之后运行。您得到的错误告诉您,在执行该行时,任务
testScript
尚未创建。所以,您需要稍后执行它。我已经将它放在我的
测试脚本.gradle
项目(“:app”)
范围中。我可以做
/gradlew clean
而没有问题。但是当运行
/gradlew assembly
时,它会出错,
无法确定任务“:app:testScript”的依赖关系。无法解析配置“:app:compile”的所有任务依赖项。无法解析项目:remotelib