Gradle项目的自定义条件配置

时间:2012-05-11 16:08:58

标签: gradle

摘自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,...)所以我想我在这里弄错了。

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

1 个答案:

答案 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不会调用闭包。)