我正在编写几个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}}的配置块都会运行。如何定义应在配置时运行的代码,但仅限于定义包含它的任务?
答案 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。