【问题标题】:Gradle: Mark a plugin subtask as non-runnable depending on environment or other propertyGradle:根据环境或其他属性将插件子任务标记为不可运行
【发布时间】:2016-10-21 16:37:13
【问题描述】:

我刚刚测试了Flyway 的数据库迁移功能,并对其功能和工作流程感到惊喜。

但是,有一个问题:Flyway 也可以执行clean 任务,该任务有效地从您正在访问的架构中删除所有表和过程。

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

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

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

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

我可以用 Gradle 做到这一点吗?


编辑

在发布问题后不久,我注意到flyway 配置选项还包括一个cleanDisabled 选项,它可以完全按照我的意愿进行。为了不必删除这个问题:如果插件本身没有这样的选项,这通常是可能的吗?

【问题讨论】:

    标签: gradle groovy build-script


    【解决方案1】:

    是的,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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2014-03-05
      相关资源
      最近更新 更多