Gradle 3.0.0(在Android Studio 3.0中)重新排序任务序列(使用Kotlin模块编译时)?
我有一个简单的gradle脚本(只是在gradle任务运行时记录) 我有一个简单的Android项目“app”,它依赖于Kotlin中的模块“remotelib” 我的应用程序的build.gradle依赖项如下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
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
中构建默认配置,从而在其中编译Kotlin:remotelib
这明确指定任务依赖于testScript.dependsOn项目(':remotelib')。compileKotlin
,但它要求在:remotelib:compileKotlin
之前对:app
进行评估(您可能需要将:remotelib
行添加到评估依赖项:remotelib'
的构建脚本中):app
: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'
。我尝试在appbuild.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代码>