Continuous integration 按顺序调用其他任务的渐变任务

Continuous integration 按顺序调用其他任务的渐变任务,continuous-integration,gradle,Continuous Integration,Gradle,我正在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 :testClas

我正在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决定执行任务的最佳顺序。 我通过遵循其中的建议解决了我的问题,该建议也记录在中,以确定不同任务之间的顺序。因此,我的最终ci目标如下所示:

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

现在一切正常。

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

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

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

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


希望这能有所帮助。

TLDR版本:以下是我在一个项目中如何做到这一点(不引入人为依赖项)

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


使用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]
}

这样,您就可以在一个地方列出任务列表。

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接答案可能无效。完成。如果有人花时间来这里解释事情(并根据你的反馈调整答案),你不应该投反对票。这使我不想在这里发表文章。我过去曾尝试过这种方法,但我不喜欢它,因为它引入了人工依赖。在过去,我在获得我所需要的订单时遇到了一些问题。我发现本线程其他地方介绍的“别名”方法效果更好(并且不会引入人为依赖项)
./gradlew all
./gradlew rebuild
gradle all
gradle rebuild
def taskNames = [...] // list of task names

task('lastTask', dependsOn: taskNames)

taskNames.inject(null) { acc, val ->
  if (acc != null) tasks[val].mustRunAfter acc
  tasks[val]
}