如果另一个在gradle中不是UP-TO-DATE,则仅运行任务

时间:2015-01-16 22:29:19

标签: gradle task

我想在Gradle中进行功能测试时自动添加serverRun任务,所以我添加了一个依赖项:

funcTestTask.dependsOn(serverRun)

无论funcTestTask是否运行

,都会导致任务运行
:compile
:serverRun
:funcTestTask (and associate compile tasks... etc)
:serverStop

OR

:compile UP-TO-DATE
:serverRun <-- unnecessary 
:funcTestTask UP-TO-DATE
:serverStop

启动服务器的成本非常高,我只想在FunctionalTest 不是 UP-TO-DATE,我想做什么或者什么的时候开始:

if(!funcTestTask.isUpToDate) {
    funcTestTask.dependsOn(serverRun)
}

所以我知道我不知道funcTestTask的最新状态,直到它的所有输入/输出被确定,但我可以继承它的uptoDate checker吗?

serverRun.outputs.upToDateWhen(funcTestTask.upToDate)

替代方案是&#34; doFirst&#34; FuncTest中的ServerRun,我认为通常不赞成?

funcTestTask.doFirst { serverRun.execute() }

有没有办法在另一个任务之前有条件地运行任务?

更新1
尝试的设置输入/输出相同的

serverRun.inputs.files(funcTestTask.inputs.files)
serverRun.outputs.files(funcTestTask.outputs.files)

这似乎在重新编译时重新运行服务器(好),在成功更改功能测试后跳过重新运行(也很好),但在下面的测试失败后不会重新运行测试

:compile
:serverRun
:funcTestTask FAILED

then

:compile UP-TO-DATE
:serverRun UP-TO-DATE <-- wrong!
:funcTestTask FAILED

4 个答案:

答案 0 :(得分:1)

我最终写了一个失败文件&#39;并将其作为serverRun任务的输入

File serverTrigger = project.file("${buildDir}/trigger") 

project.gradle.taskGraph.whenReady { TaskExectuionGraph taskGraph ->
  // make the serverRun task have the same inputs/outputs + extra trigger
  serverRun.inputs.files(funcTestTask.inputs.files, serverTrigger)
  serverRun.outputs.files(funcTestTask.outputs.files)
}

project.gradle.taskGraph.afterTask { Task task, TaskState state ->
  if (task.name == "funcTestTask" && state.failure) {
    serverRun.trigger << new Date()
  }
}

在gradle论坛上回答我的问题的答案: http://forums.gradle.org/gradle/topics/how-can-i-start-a-server-conditionally-before-a-functionaltestrun

答案 1 :(得分:1)

面对同样的问题,我找到了一个非常干净的解决方案。在我的情况下,我希望在构建运行时生成eclipse项目设置,但仅在生成新jar时生成。当jar是最新的时,不应该执行项目设置。以下是如何实现这一目标:

tasks.eclipse {
  onlyIf {
    !jar.state.upToDate
  }
}

build {
  dependsOn tasks.eclipse
}

答案 2 :(得分:0)

由于任务是您尝试控制的任务的依赖任务,因此您可以尝试:

tasks {
    onlyIf {
        dependsOnTaskDidWork()
    }
}

答案 3 :(得分:0)

我遇到了同样的问题,但我提出的解决方案要简单得多。 只有在需要测试时才会启动服务器

test {
    doFirst {
        exec {
            executable = 'docker/_ci/run.sh'
            args = ['--start']
        }
    }

    doLast {
        exec {
            executable = 'docker/_ci/run.sh'
            args = ['--stop']
        }
    }
}