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

loo*_*oka 8 task gradle

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

funcTestTask.dependsOn(serverRun)
Run Code Online (Sandbox Code Playgroud)

无论funcTestTask是否运行,都会导致任务运行

:compile
:serverRun
:funcTestTask (and associate compile tasks... etc)
:serverStop

OR

:compile UP-TO-DATE
:serverRun <-- unnecessary 
:funcTestTask UP-TO-DATE
:serverStop
Run Code Online (Sandbox Code Playgroud)

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

if(!funcTestTask.isUpToDate) {
    funcTestTask.dependsOn(serverRun)
}
Run Code Online (Sandbox Code Playgroud)

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

serverRun.outputs.upToDateWhen(funcTestTask.upToDate)
Run Code Online (Sandbox Code Playgroud)

替代方案是在FuncTest中"doFirst"ServerRun,我认为这通常不赞成?

funcTestTask.doFirst { serverRun.execute() }
Run Code Online (Sandbox Code Playgroud)

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

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

serverRun.inputs.files(funcTestTask.inputs.files)
serverRun.outputs.files(funcTestTask.outputs.files)
Run Code Online (Sandbox Code Playgroud)

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

:compile
:serverRun
:funcTestTask FAILED

then

:compile UP-TO-DATE
:serverRun UP-TO-DATE <-- wrong!
:funcTestTask FAILED
Run Code Online (Sandbox Code Playgroud)

Ole*_*yar 6

遇到同样的问题后,我找到了一个非常干净的解决方案。就我而言,我希望在构建运行时生成 eclipse 项目设置,但仅在生成新 jar 时生成。当 jar 是最新的时,不应执行任何项目设置。这是实现这一目标的方法:

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

build {
  dependsOn tasks.eclipse
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎对我不起作用。state.upToDate 始终返回 false,即使该任务实际上后来被认为是最新的。 (4认同)

loo*_*oka 3

我最终写入了“故障文件”并将其作为 serverRun 任务的输入:

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

project.gradle.taskGraph.whenReady { TaskExecutionGraph 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()
  }
}
Run Code Online (Sandbox Code Playgroud)

来自 Gradle 论坛上我的问题的答案的信息: http://forums.gradle.org/gradle/topics/how-can-i-start-a-server-conditionally-before-a-functiontestrun