如何在Gradle中配置时运行特定于任务的块

时间:2014-04-10 14:38:14

标签: gradle

我正在编写几个Gradle任务,当publishA运行时,我想发布到一个Artifactory存储库,当publishB运行时,我想发布到另一个。task publishA() { println "In project" project.ext.artifactory_target = 'foo' } task publishB() { println "In candidate" project.ext.artifactory_target = 'bar' } artifactory { contextUrl = "${artifactory_contextUrl}" publish { repository { repoKey = "${artifactory_target}" maven = true username = "${artifactory_user}" password = "${artifactory_password}" } } } 。我有以下代码:

publishA

...但很明显,这不起作用,因为publishB和{{1}}的配置块都会运行。如何定义应在配置时运行的代码,但仅限于定义包含它的任务?

1 个答案:

答案 0 :(得分:0)

你应该可以这样做:

project.ext.artifactory_target = 'your_target_foo'

gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
    if(taskGraph.hasTask(your_candiate_target_name)) {
        project.ext.artifactory_target = "your_target_bar"
    }
}

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    publish {
        repository {
            repoKey = {project.artifactory_target} // <- Location of braces is important.
            maven = true
            username = "${artifactory_user}"
            password = "${artifactory_password}"
        }
    }
}

上面的代码中发生了三件事。首先,定义一个自定义变量来保存您的目标。其次,创建一个钩子,它将在Gradle完成计算出要执行的所有任务后执行。在此钩子中,如果我们要执行您的特定任务,则更新我们已定义的自定义变量。最后,在artifactory配置中,我们传递一个闭包,它返回我们在上面玩过的变量的当前值。

Gradle与构建,初始化阶段,配置阶段和执行阶段有三个不同的阶段。初始化阶段是Gradle设置自己的时候,配置阶段是它确定它需要做什么以及要运行什么任务,然后执行阶段是它实际执行所有操作的时间。 .gradle文件中的大多数内容都发生在配置阶段。您可以将.gradle文件中的大多数块视为设置要传递给任务的数据的结构,然后在执行阶段运行。通过将变量的评估移动到闭包,我们将逻辑的这一部分从配置阶段移动到执行阶段,允许我们做一些有趣的事情,比如根据正在执行的任务来定制它的内容

有关Gradle生命周期的更多信息,请take a look here