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



我刚刚测试了Flyway用于DB迁移,并对其功能和工作流程感到惊喜。

然而,有一个问题:Flyway也可以执行clean任务,有效地从您正在访问的模式中删除所有表和过程。

例如,这个子任务应该在开发环境中运行,但不能在生产环境中运行:有可能有人误解了它的含义,错误地杀死了生产DB。

是否有可能禁用(或简单地删除)插件的子任务?我可以这样做:

flywayClean {
    enabled = project.hasProperty('devenv')
    if(!enabled) {
        throw new StopExecutionException("Disabled on production servers.")
    }
}

但不幸的是,这会阻止构建完成。理想情况下,我希望只在任务特别运行时抛出这样的异常,无论是从另一个任务还是从命令行。

我可以用Gradle做这个吗?


编辑:

张贴问题后不久,我注意到flyway配置选项还包括一个cleanDisabled选项,可以做我想要的。这样就不必删除这个问题了:如果插件本身没有这样的选项,一般来说这是可能的吗?

是的,Gradle中的每个任务都有一个闭包列表,当任务运行时要执行。你可以通过添加'doFirst'闭包将任何闭包添加到该列表的头部。

不要使用启用的变量,而是直接检查属性。否则你会得到

任务开始执行后,无法在任务':flywayClean'上调用task . setenabled (boolean)。

并抛出一个常规异常,如果你想要完整的运行失败,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
        }
    }
}

最新更新