gpt4 book ai didi

Gradle dependson 与多项目中的 defaultTasks

转载 作者:行者123 更新时间:2023-12-03 03:20:07 25 4
gpt4 key购买 nike

关于 Gradle(3.3 版)如何解决多项目设置(使用 java 子项目)中的任务依赖性的小问题。我对 gradle 很陌生,所以这可能是个愚蠢的问题......

我想实现一个任务在编译前执行,一个在编译后执行。

使用 defaultTasks 它按预期工作。但是当使用 dependsOn 定义任务时,它不会。

我的根 build.gradle 文件如下所示:

defaultTasks 'a', 'classes', 'b'

task a {
doLast {
println 'before compile'
}
}

task b {
doLast {
println 'after compile'
}
}

task doIt(dependsOn: [a, 'classes', b]) {
doLast {
println('done!')
}
}

allprojects {
group = 'foo'

repositories {
mavenCentral()
maven {
url 'https://maven.atlassian.com/3rdparty/'
}
}
}

subprojects {
ext {
springVersion = '4.3.5.RELEASE'
}
apply plugin: 'java'
dependencies {
compile fileTree(dir: 'lib', include: '*.jar')
testCompile group: 'junit', name: 'junit', version: '4.12'
}
}

当我执行 gradle 时,默认任务按预期执行:我得到“编译前”,然后编译所有子项目,然后“编译后”。

当我执行 gradle doIt 时,我收到以下错误消息

Task with path 'classes' not found in root project 'teambits-core'.

知道为什么会这样吗?

最佳答案

按原样使用您的 build.gradle,仅运行“gradle”会在我的 3.3 安装中出现相同的错误。

您在这里遇到了 2 个问题。

<强>1。多项目子项目与所有项目

第一个问题是 defaultTasks 是在主 build.gradle 中定义的,但您的 java 插件仅包含在子项目中。

在多项目构建中,“master”项目不是子项目部分的一部分(只有 allprojects 影响主项目),但您的“defaultTasks”是在顶层定义的,因此运行“gradle”将调用主项目中的 defaultTasks 并在类任务上失败,因为它没有加载 java 插件。

要解决此问题,请将“应用插件”行移动到所有项目(但仅用于此说明,通常您不希望在 master 中加载 java 插件,因为它通常与设置子项目有关)。

<强>2。 defaultTasks 与 dependsOn

第二个问题是(假设您移动了 apply 插件)那么您将了解 defaultTasks 和 dependsOn 之间的真正区别。

defaultTasks 按照您指定的顺序运行任务:

$ gradle
:a
before compile
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:b
after compile

BUILD SUCCESSFUL

Total time: 0.765 secs

但是以列表顺序运行 doIt 将导致 gradle 按字母顺序运行它们(因为它们之间没有依赖关系,在这种情况下它将按字母顺序运行它们)。

$ gradle doit
:a
before compile
:b
after compile
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:doIt
done!

BUILD SUCCESSFUL

Total time: 0.733 secs

使用 mustRunAfter 修复依赖顺序

在这种情况下,您可以通过向 doIt 添加以下内容来修复它:

task doIt(dependsOn: [a, 'classes', b]) {
b.mustRunAfter(':classes')
doLast {
println('done!')
}
}

这将强制 b 任务稍后完成。

关于Gradle dependson 与多项目中的 defaultTasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41769080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com