摘自https://github.com/gradle/gradle/blob/master/build.gradle:
ext {
isDevBuild = {
gradle.taskGraph.hasTask(developerBuild)
}
}
task developerBuild {
description = 'Builds distributions and runs pre-checkin checks'
group = 'build'
dependsOn testedDists
}
当我使用这种方法在我的项目中创建自定义配置时,我发现:
isDevBuild === true
即。它总是正确的,因为任务'developerBuild'在我的build.gradle项目中,因此在图中。他们有几个“不同”的配置(isCIBuild,isCommitBuild,isFinalReleaseBuild,...)所以我想我在这里弄错了。
有人可以根据一些外部参数解释如何使这个配置有条件吗?
答案 0 :(得分:39)
taskGraph.hasTask()
告诉任务是否在任务执行图中,即它是否会被执行。因为任务执行图仅在配置阶段之后创建,所以必须从whenReady
回调(或在执行阶段)调用此方法:
gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(developerBuild)) {
// do conditional configuration
}
}
为了使其更具可读性,我们可以引入一种新方法:
def onlyFor(task, config) {
gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(task)) {
project.configure(project, config)
}
}
}
现在我们可以写:
onlyFor(developerBuild) { ... }
onlyFor(ciBuild) { ... }
解决此问题的另一种更简单的方法是检查gradle.startParameter.taskNames
中是否包含特定任务名称。但是,这有两个限制:首先,它比较任务名称,这可以在多项目构建中产生影响。其次,它只能找到直接指定的任务(例如在命令行上),而不是其依赖项。
PS。:在你的代码中,isDevBuild
总是成立,因为根据Groovy的真相,(非空)闭包是true
。 (与isDevBuild()
相反,isDevBuild
不会调用闭包。)