分级任务按顺序调用其他任务



我正在gradle中制作一个任务,该任务需要调用许多其他任务。

这是我的:

task ci(dependsOn: [
    clean,
    build,
    test
])

奇怪的是我看到的输出:

gradle ci
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:clean             // cleaning after the build
:build
:ci

请注意,清理发生在构建目标之后,这将擦除我的构建。

如果我将任务更改为:

task ci(dependsOn: [
    clean,
    test
])

然后它似乎按正确的顺序执行:

:clean UP-TO-DATE    // cleaning before the build
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:ci UP-TO-DATE

我尝试通过添加build.dependsOn clean来修复最初的目标,但这似乎没有影响。

感谢您的帮助。

我似乎偶然发现了GRADLE-427中争论的问题,在这个问题中,GRADLE确定了执行任务的最佳顺序。我通过遵循其中的建议解决了我的问题,该建议也记录在Gradle用户指南第15.5节中,以建立不同任务之间的排序。因此,我的最终ci目标显示为:

task ci(dependsOn: ['clean', 'build', 'uploadArchives'])
build.mustRunAfter clean
uploadArchives.mustRunAfter build

现在一切如愿以偿。

TLDR版本:以下是我在其中一个项目中如何做到这一点(没有引入人工依赖关系)。

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets
def buildAliases = [
   'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'],
   'rebuild' : ['clean', 'assemble']
]
def expandedTaskList = []
gradle.startParameter.taskNames.each {
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it)
}
gradle.startParameter.taskNames = expandedTaskList.flatten()
println "nntexpanded task list: ${gradle.startParameter.taskNames }nn"

为了使用这些别名,请将它们称为任务。示例:

./gradlew all
./gradlew rebuild

gradle all
gradle rebuild

有关更多背景信息,请参阅:

https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

我不希望仅仅为了确保订单而添加包装任务。

在这种情况下,我的解决方案如下-

run.dependsOn 'clean' compileJava.mustRunAfter 'clean'

这确保了在gradle执行compileJava之前执行clean任务。因此,有效地,您将始终创建一个全新的构建。

希望这能有所帮助。

使用Groovy/Gradle的一些优点,可以通过以下内容进一步改进解决方案:

def taskNames = [...] // list of task names
task('lastTask', dependsOn: taskNames)
taskNames.inject(null) { acc, val ->
  if (acc != null) tasks[val].mustRunAfter acc
  tasks[val]
}

通过这种方式,您可以在一个位置列出任务列表。

相关内容

最新更新