Gradle 停止finalizedBy任务的执行,或仅在条件下执行后续任务

Gradle 停止finalizedBy任务的执行,或仅在条件下执行后续任务,gradle,Gradle,我正在使用com.google.cloud.tools.appenginegradle插件,它有一个任务appengineDeploy 我有两个任务在执行前配置appengineDeploy任务。我当前的解决方案如下所示: task deployTest() { doFirst { appengine.deploy { version = 'test' ... } } finalizedBy

我正在使用
com.google.cloud.tools.appengine
gradle插件,它有一个任务
appengineDeploy

我有两个任务在执行前配置
appengineDeploy
任务。我当前的解决方案如下所示:

task deployTest() {
    doFirst {
        appengine.deploy {
            version = 'test'
            ...
        }
    }
    finalizedBy appengineDeploy
}


task deployProduction() {
    doFirst {
        appengine.deploy {
            version = '7'
            ...
        }
    }
    finalizedBy appengineDeploy
}
现在我想在执行
deployProduction
任务之前添加一个安全问题,如下所示:

println "Are you sure? (y/n)"
def response = System.in.newReader().readLine()
if (response != 'y') {
    throw new GradleException('Task execution stopped')
}
task deployProduction() {
    doFirst {
        println 'deployProduction()'

        println "Are you sure? (y/n)"
        def response = System.in.newReader().readLine()

        if (response != 'y') {
            project.tasks.appengineDeploy.enabled = false
        }
    }

    finalizedBy appengineDeploy
}
task deployProduction() { task ->
  doFirst {
    securityQuestion(this, task)
  }

  finalizedBy appengineDeploy
}
问题是,根据定义,即使我的任务抛出异常,
finalizedBy
任务也会执行,这与我想要的正好相反

我无法将其更改为
appengineDeploy dependsOn deployTest
并调用
appengineDeploy
,因为我有两个配置不同的任务。
我无法更改appengineDeploy任务,因为它来自插件

是否有其他方法可以停止执行
appengineDeploy
,或在部署任务后使用
finalizedBy
以外的其他方法执行该任务?

一种方法是利用来决定是否执行该任务,例如通过检查项目属性

这里有一个小演示,因为任务
appengineDeploy
是由插件贡献的任务(有关详细信息,请参阅注释):

另一个选项是禁用任务,如下所示:

println "Are you sure? (y/n)"
def response = System.in.newReader().readLine()
if (response != 'y') {
    throw new GradleException('Task execution stopped')
}
task deployProduction() {
    doFirst {
        println 'deployProduction()'

        println "Are you sure? (y/n)"
        def response = System.in.newReader().readLine()

        if (response != 'y') {
            project.tasks.appengineDeploy.enabled = false
        }
    }

    finalizedBy appengineDeploy
}
task deployProduction() { task ->
  doFirst {
    securityQuestion(this, task)
  }

  finalizedBy appengineDeploy
}

我稍微修改了thokuest的答案(感谢您的帮助!),以防止执行其间的任何任务。
我创建它作为扩展方法,因为我不止一次需要它:

ext.securityQuestion = { project, task ->
  println "Are you sure you want to execute ${project.name}:${task.name}? (y/n)"
  def response = System.in.newReader().readLine()

  if (response != 'y') {
    project.tasks.each {
      if (it != task)
        it.enabled = false
    }
    throw new GradleException("Execution of ${project.name}:${task.name} aborted")
  }
}
现在我的任务是这样的:

println "Are you sure? (y/n)"
def response = System.in.newReader().readLine()
if (response != 'y') {
    throw new GradleException('Task execution stopped')
}
task deployProduction() {
    doFirst {
        println 'deployProduction()'

        println "Are you sure? (y/n)"
        def response = System.in.newReader().readLine()

        if (response != 'y') {
            project.tasks.appengineDeploy.enabled = false
        }
    }

    finalizedBy appengineDeploy
}
task deployProduction() { task ->
  doFirst {
    securityQuestion(this, task)
  }

  finalizedBy appengineDeploy
}

我不能做第一个选项,因为
appengineDeploy
任务来自一个我无法控制的插件。第二个选项似乎有效,尽管它仍然执行到
appengineDeploy
为止的每个任务。它不是最优的,但至少它阻止了它的执行。@stschmitt
onlyf
也可以应用于插件提供的任务。我用
appengineDeploy.configure{}
更新了答案。很好,我不知道你可以配置外部任务。剩下的最后一个麻烦是,它仍然会运行到appengineDeploy之前的所有任务,这相当麻烦。但至少它不会执行最重要的一个。