Gradle:根据环境或其他属性,将插件子任务标记为不可运行
我刚刚测试了用于DB迁移的Gradle:根据环境或其他属性,将插件子任务标记为不可运行,gradle,groovy,build-script,Gradle,Groovy,Build Script,我刚刚测试了用于DB迁移的Flyway,并对其功能和工作流程感到惊喜 但是,有一个问题:Flyway还可以执行一项任务,该任务可以有效地从正在访问的模式中删除所有表和过程 例如,这个子任务应该可以在开发环境中运行,但不能在生产环境中运行:可能有人误解了它的含义并错误地杀死了生产数据库 是否可以禁用(或只是删除)插件的子任务?我可以这样做: flywayClean { enabled = project.hasProperty('devenv') if(!enabled) {
Flyway
,并对其功能和工作流程感到惊喜
但是,有一个问题:Flyway
还可以执行一项任务,该任务可以有效地从正在访问的模式中删除所有表和过程
例如,这个子任务应该可以在开发环境中运行,但不能在生产环境中运行:可能有人误解了它的含义并错误地杀死了生产数据库
是否可以禁用(或只是删除)插件的子任务?我可以这样做:
flywayClean {
enabled = project.hasProperty('devenv')
if(!enabled) {
throw new StopExecutionException("Disabled on production servers.")
}
}
但不幸的是,这阻止了构建的完成。理想情况下,我只想在任务从另一个任务或命令行运行时抛出这样的异常
我能和Gradle一起做这个吗
编辑:
发布问题后不久,我注意到
flyway
配置选项还包括一个cleansabled
选项,该选项可以完全按照我的意愿执行。这样就不必删除这个问题了:如果插件本身没有这样的选项,一般来说这是否可行?是的,Gradle中的每个任务都有一个在任务运行时要执行的闭包列表。您可以通过添加“doFirst”闭包将任何闭包添加到该列表的开头
不要使用已启用的变量,而是直接检查属性。否则你会被解雇的
无法在任务开始执行后对任务“:flywayClean”调用Task.setEnabled(布尔值)
并引发常规异常如果希望整个运行失败,StopExecutionException只会停止当前任务执行其余的任务闭包,而不会显示错误消息
flywayClean {
doFirst{
if(!project.hasProperty('devenv')) {
throw new Exception("Disabled on production ervers.")
}
}
}
备选方案:
另一种方法是根据条件跳过任务。在这里,您可以更改启用的变量,因为我们尚未开始任务执行。请记住向用户打印一个原因,以便用户了解跳过任务的原因
gradle.taskGraph.whenReady { taskGraph ->
if (!project.hasProperty('devenv')){
taskGraph.allTasks.find {it.name == 'flywayClean'}.each{
println 'Disabling flywayClean due to missing property "devenv"'
it.enabled = false
}
}
}