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
}
有很多在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
的构建脚本)。
上面的'TestScriptTask'全部驻留在'test_script.gradle'文件中。在'build.gradle'这个项目中,我调用''test_script.gradle''。我尝试在应用程序'build.gradle'中,甚至在'test_script.gradle'中应用你提出的'testScript.dependsOn configurations.compile' ...但是不断收到错误。我应该在哪里放置你的建议脚本? – Elye
@Elye,你得到的错误是什么?基本上,我在回答中提出的解决方案应该在* testScript任务创建后应用。也就是说,在'build.gradle'中应用':'后,或在'test_script.gradle'中的任务定义之后。 – hotkey
我得到这个错误'无法得到类型为org.gradle.api.Project.'的根项目'MyApplication'的未知属性'testScript''我将它添加到''test_script.gradle''的行后面:显示在我上面的更新中。 – Elye
Android Gradle插件3.0中有很多更改。0以及它与Kotlin插件的互操作,并且这些更改还可能包括一些影响任务排序的部分。然而,在你的例子中,你不指定(至少在这里发布的代码中)你的':app:testScript'任务依赖'remotelib'中的Kotlin编译。它可以通过'dependsOn'关系完成,也可以通过'app'的'compile'配置作为'testScript'任务的输入。否则,这两个任务之间的执行顺序是未定义的,并且它们可以以任意顺序运行。 – hotkey
感谢@hotkey。你能告诉我如何使':app:testScript任务取决于在remotelib中的Kotlin编译吗?谢谢。 – Elye
不客气。我已经描述了如何在答案中做到这一点。 – hotkey