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

标签 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 会在 taskB 检查 onlyIf 之前执行,所以即使条件失败, taskA 将执行。

我怎样才能做到这一点?

最佳答案

看来任务图解析完成后就可以配置了。在较早的阶段,所有条件都将在配置 阶段进行评估,这还为时过早。看看这个:

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

关于gradle:从另一个任务调用一个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40850083/

相关文章:

grails - 'groovy' 和 'grails-web' 插件 gradle 之间的冲突

gradle - 使用远程存储库时,Gradle构建问题

maven - 在 gradle 中更改本地 Maven 存储库的位置

android - 选择 Android 库的构建变体的 Gradle 脚本

android - 无法解析com.github.navasmdc:MaterialDesign:1.5

java - Grails UnitTest 确保 BigDecimal 不是字符串

Gradle javadoc 搜索重定向到 “/undefined/..” URL

grails - grails命令有错误

groovy - Groovy @Mixin 中 'return this' 的类型

java - JMeter中解决库冲突的方法?