gradle中的条件逻辑构建为仅在特定任务运行时执行某些代码

时间:2016-11-24 17:35:08

标签: gradle build.gradle flyway

所以,我在我的gradle构建中使用了一个插件(该插件是org.flywaydb.flyway,但这并不是真的相关)。我希望验证调用者在执行此插件的任务时是否已通过运行时参数传递,而不是在其他任务正在执行时传递。

我根据提供的参数将选项传递给flyway插件。我想要在执行flywayTask并且没有提供参数时返回错误。当正在运行非飞路任务时,我不想验证是否提供了参数。

gradle -PmyParam=myValue flywayMigration

=>应该运行代码,应该没有错误

gradle flywayMigration

=>应该运行代码并且应该产生错误(因为没有提供参数)

gradle jar

=>不应该运行代码,不应该产生错误

我一直在阅读有关gradle配置和执行的信息,但是我仍然无法找到一种方法,只有在flyway插件执行或执行特定的flyway任务时才运行代码。

这是我目前的代码:

if(gradle.taskGraph.hasTask("flywayMigrate")) {
    flyway {

        def dbCode, dbUser, dbPassword, dbUrl

        if (!project.hasProperty("db_env")) {
            throw new GradleException("Expected db_env property to be supplied for migration task. Can be passed" +
                    " at command line e.g. [gradle -Pdb_env=ex1 flywayMigrate]")

        } else {
            // do stuff

        }

        user = balh
        password = blah
        url = blah
        driver = 'oracle.jdbc.OracleDriver'
        cleanDisabled = true
        baselineOnMigrate = true
        baselineVersion = '1.0.0'

    }
}

要清楚,我只想要这段代码:

if (!project.hasProperty("db_env")

运行飞路任务。

上面的代码抛出了这个错误:

Task information is not available, as this task execution graph has not been populated.

我在这里做了一些尝试,任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

我不是很清楚,如果提供了这个属性,你究竟想做什么,但我认为,你可以在不访问任务图的情况下做到这一点,只是尝试使用doFirst关闭flywayMigrate任务。就像这样:

flywayMigrate.doFirst {
    if(!project.hasProperty("db_env")) {
        throw ...
    } else {
        //Do something
    }
}

让您的插件配置免于任何其他逻辑。

至于例外,您是否曾尝试等到图表准备就绪?通常按如下方式完成:

gradle.taskGraph.whenReady {taskGraph ->
    if(gradle.taskGraph.hasTask("flywayMigrate")) {
        ...
    }
}

更新:回答评论中的问题

  

如果我可以将doFirst附加到多个任务中?

是的,你可以使用像:

这样的东西
//declare task names
def names = ["taskA", "taskB", "taskC"]
tasks.findAll {it ->
    //filter tasks with names       
    if (it.name in names)
        return it
}.each { it -> 
    //add some extra logic to it's doFirst closure
    it.doFirst {
        println 'hello'
    }
}

在此配置之前,请检查所有任务是否存在。