15

从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,......)所以我想我这里出了点问题。

有人可以解释如何根据一些外部参数使这个配置有条件吗?

4

1 回答 1

40

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始终成立,因为(非空)闭包是true根据 Groovy 真理。(相比之下isDevBuild()isDevBuild不会调用闭包。)

于 2012-05-11T17:20:58.063 回答