对于摇篮项目自定义条件配置(Custom conditional configuration for

2019-07-29 08:53发布

具有由提取物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项目中,因此图中。 他们有一对夫妇的“不同” CONFIGS(isCIBuild,isCommitBuild,isFinalReleaseBuild,...),所以我想我有什么错在这里。

有人能解释如何使这个CONFIGS有条件一些外部参数?

Answer 1:

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不会调用关闭。)



文章来源: Custom conditional configuration for Gradle project
标签: gradle