从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不会调用闭包.)
| 归档时间: |
|
| 查看次数: |
14711 次 |
| 最近记录: |