保证运行特定的Gradle任务

时间:2014-02-14 18:35:58

标签: gradle

鉴于下面的“build.gradle”文件,我想确保在调用stopServer时运行testServerLifecycle。目前,如果runTestOnServer任务失败,则构建停止。 如果runTestOnServer是任务图上的唯一内容,我不想运行stopServer

的build.gradle

tast startServer {}

task runTestOnServer {
    dependsOn startServer
}

tast stopServer {}

task testServerLifecycle {
    dependsOn runTestOnServer
    finalizedBy stopServer
}

Gradle是否支持此类功能?我可以做什么来确保在stopServer位于任务图上时运行testServerLifecycle

详情:Gradle 1.9


解决方案

gradle.taskGraph.afterTask { Task task, TaskState state ->
    if (task == runTestOnServer
            && state.failure
            && gradle.taskGraph.getAllTasks().contains(stopServer)) {
        println "----------------- Stopping Server -----------------"
        tasks.stopServer.execute()
    }
}

我无法在'runTestOnServer'任务上使用finalizedBy,因为当且仅当'stopServer'运行正常时,我才想运行'stopServer';使用finalizedBy会强制它每次都运行。

应该注意的是,这会在每个任务之后运行。

1 个答案:

答案 0 :(得分:2)

由于finalizedBy不能跨任务传递,因此应直接应用于startServer任务。我认为这样的事情应该涵盖它:

task startServer { // ...}
task stopServer { // ...}

startServer.finalizedBy('stopServer')
stopServer.mustRunAfter('runTestOnServer')

task runTestOnServer {
    dependsOn startServer
    // ...
}

或者,您可以使用afterTask并删除stopServer和testServerLifecycle

gradle.taskGraph.afterTask { Task task, TaskState state ->
   if (task == runTestOnServer) {
      // clean up, implement stopServer here
   }
}

您还可以根据任务的状态制定不同的规则,如下所示:

gradle.taskGraph.afterTask { Task task, TaskState state ->
   if (state.failure) {
      // Handle the failure
      println "$task FAILED!!!"
   } else {
      println "SUCCESS!!!"
   }
}

这应该在每次task执行后运行。