我有一个简单的 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/