ewok ewok - 5 days ago 5
Groovy Question

gradle: calling a task from another task

I am aware that the currently supported method for invoking a task from another task is to use

dependsOn
or
finalizedBy
, but I run into an issue with this.

I have a task,
taskA
, that is usable on it's own. I have another task,
taskB
, which, when called, will depend upon
taskA
. The problem is that
taskB
has additional conditions that require the task be skipped if they fail. Here is the workflow I am going for:

$ 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


If called directly, or as a
doFirst
or
dependsOn
or something from a different task,
taskA
should execute regardless of the conditions. But if
taskB
is called, the conditions must pass before
taskA
is executed. Here's what I've tried:

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


The problem here is that
taskA
will execute before the
onlyIf
is checked on
taskB
, so even if a condition fails,
taskA
will execute.

How can I accomplish this?

Answer

It seems that it can be configured no sooner than with after task's graph has been resolved. At the earlier stages all conditions will be evaluated on configuration phase which is too early. Have a look at this:

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
}

And the output:

 ~/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
Comments