具有由提取物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有条件一些外部参数?
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
不会调用关闭。)