Gradle项目的自定义条件配置

Art*_*rov 15 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
}
Run Code Online (Sandbox Code Playgroud)

当我使用这种方法在我的项目中创建自定义配置时,我发现:

isDevBuild === true
Run Code Online (Sandbox Code Playgroud)

即它总是正确的,因为任务'developerBuild'在我的build.gradle项目中,因此在图中.他们有几个"不同"的配置(isCIBuild,isCommitBuild,isFinalReleaseBuild,...)所以我想我在这里遇到了一些问题.

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

Pet*_*ser 40

taskGraph.hasTask()告诉任务是否在任务执行图中,即它是否会被执行.因为任务执行图仅在配置阶段之后创建,所以必须从whenReady回调(或在执行阶段)调用此方法:

gradle.taskGraph.whenReady { graph ->
    if (graph.hasTask(developerBuild)) { 
        // do conditional configuration
    }
} 
Run Code Online (Sandbox Code Playgroud)

为了使其更具可读性,我们可以引入一种新方法:

def onlyFor(task, config) {
    gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(task)) { 
            project.configure(project, config)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以写:

onlyFor(developerBuild) { ... }
onlyFor(ciBuild) { ... } 
Run Code Online (Sandbox Code Playgroud)

解决此问题的另一种更简单的方法是检查是否包含特定任务名称gradle.startParameter.taskNames.但是,这有两个局限性:首先,它会比较任务名称,这可能会对多项目构建产生影响.其次,它只能找到直接指定的任务(例如在命令行上),而不是其依赖性.

PS.:在你的代码中,isDevBuild始终保持,因为(非空)闭包是true根据Groovy的真相.(相反isDevBuild(),isDevBuild不会调用闭包.)

  • 感谢在SO处查看问题:并非所有的首席开发人员都会投入时间进行社区支持. (5认同)