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
为止的每个任务。它不是最优的,但至少它阻止了它的执行。@stschmittonlyf
也可以应用于插件提供的任务。我用appengineDeploy.configure{}
更新了答案。很好,我不知道你可以配置外部任务。剩下的最后一个麻烦是,它仍然会运行到appengineDeploy之前的所有任务,这相当麻烦。但至少它不会执行最重要的一个。