Gradle:根据环境或其他属性,将插件子任务标记为不可运行

Gradle:根据环境或其他属性,将插件子任务标记为不可运行,gradle,groovy,build-script,Gradle,Groovy,Build Script,我刚刚测试了用于DB迁移的Flyway,并对其功能和工作流程感到惊喜 但是,有一个问题:Flyway还可以执行一项任务,该任务可以有效地从正在访问的模式中删除所有表和过程 例如,这个子任务应该可以在开发环境中运行,但不能在生产环境中运行:可能有人误解了它的含义并错误地杀死了生产数据库 是否可以禁用(或只是删除)插件的子任务?我可以这样做: flywayClean { enabled = project.hasProperty('devenv') if(!enabled) {

我刚刚测试了用于DB迁移的
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
        }
    }
}