gradle:从另一个任务调用任务

时间:2016-11-28 17:24:41

标签: gradle groovy

我知道当前支持的从另一个任务调用任务的方法是使用dependsOnfinalizedBy,但我遇到了这个问题。

我有一个可以在其上使用的任务taskA。我还有另一个任务taskB,当被调用时,它将取决于taskA。问题是taskB有其他条件要求在失败时跳过任务。这是我要去的工作流程:

$ gradle taskA
:taskA

BUILD SUCCESSFUL
$ gradle taskB
checking condition 1... PASS
checking condition 2... PASS
:taskA
:taskB

BUILD SUCCESSFUL
$ gradle taskB
checking condition 1... PASS
checking condition 2... FAIL
:taskA SKIPPED
:taskB SKIPPED

BUILD SUCCESSFUL

如果直接调用,或作为doFirstdependsOn或来自其他任务的内容,则taskA应该执行,而不管条件如何。但是如果调用taskB,则必须在执行taskA之前通过条件。以下是我尝试过的内容:

project.tasks.create(name: "taskB", type: MyTask, dependsOn: "taskA")
project.taskB{
  onlyIf {
    if (!conditionA()){
      return false
    }
    if (!conditionB()){
      return false
    }
    return true
  }
}

此处的问题是taskA会在onlyIf上检查taskB之前执行,因此即使条件失败,taskA也会执行。

我该如何做到这一点?

2 个答案:

答案 0 :(得分:5)

似乎可以在任务图表解决后立即进行配置。在早期阶段,将在配置阶段评估所有条件,这太早了。看看这个:

task a {
  doLast {
      println 'a'
  }
}

task b {
  dependsOn a
  doLast {
      println 'b'
  }
}

gradle.taskGraph.whenReady { graph ->
    if (graph.hasTask(b)) {
        a.enabled = b.enabled = check1() && check2()
    }
}

boolean check1() {
  def ok = project.hasProperty('c')
  println "check 1: ${ok ? 'PASS' : 'FAIL'}"
  ok
}

boolean check2() {
  def ok = project.hasProperty('d')
  println "check 2: ${ok ? 'PASS' : 'FAIL'}"
  ok
}

输出:

 ~/tutorial/stackoverflow/40850083/ [master] gradle a
:a
a

BUILD SUCCESSFUL

Total time: 1.728 secs

 ~/tutorial/stackoverflow/40850083/ [master] gradle b
check 1: FAIL
:a SKIPPED
:b SKIPPED

BUILD SUCCESSFUL

Total time: 1.739 secs

 ~/tutorial/stackoverflow/40850083/ [master] gradle b -Pc
check 1: PASS
check 2: FAIL
:a SKIPPED
:b SKIPPED

BUILD SUCCESSFUL

Total time: 1.714 secs

 ~/tutorial/stackoverflow/40850083/ [master] gradle b -Pc -Pd
check 1: PASS
check 2: PASS
:a
a
:b
b

BUILD SUCCESSFUL

Total time: 1.745 secs

答案 1 :(得分:1)

我知道大多数人都不推荐这样做,但我是通过实际执行任务来实现的,因此:

bundle exec spring binstub --all