Gradle项目的自定义条件配置

Gradle项目的自定义条件配置,gradle,Gradle,具有以下提取物: 当我使用此方法在项目中创建自定义配置时,我发现: isDevBuild === true i、 这总是正确的,因为任务“developerBuild”在我的build.gradle项目中,因此在图中。他们有两个“不同”的配置(isCIBuild、isCommitBuild、isFinalReleaseBuild等等),所以我想我这里出了点问题 有人能解释一下如何根据一些外部参数使此配置有条件吗?taskGraph.hasTask()告诉我们任务是否在任务执行图中,即它是否会被

具有以下提取物:

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

isDevBuild === true
i、 这总是正确的,因为任务“developerBuild”在我的build.gradle项目中,因此在图中。他们有两个“不同”的配置(isCIBuild、isCommitBuild、isFinalReleaseBuild等等),所以我想我这里出了点问题

有人能解释一下如何根据一些外部参数使此配置有条件吗?

taskGraph.hasTask()
告诉我们任务是否在任务执行图中,即它是否会被执行。由于任务执行图仅在配置阶段之后创建,因此必须在READY回调时(或在执行阶段)从
调用此方法:

为了提高可读性,我们可以引入一种新方法:

def onlyFor(task, config) {
    gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(task)) { 
            project.configure(project, config)
        }
    }
}
现在我们可以写:

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


注:在您的代码中,
isDevBuild
始终有效,因为根据Groovy truth,(非空)闭包是
true
。(与
isDevBuild()
相反,
isDevBuild
不会调用闭包。)

回到“使用Gradle构建和测试”一书中的断言:Groovy的知识不是额外的-必须开始使用Gradle。谢谢你的帮助。今天晚些时候我会检查它。我不会说这是必须开始的,但有必要实施像这样的高级解决方案。(一个需要较少Groovy知识的简单替代方法是根据系统属性在不同配置之间切换。)然后,这些代码中的大部分可以用Java风格编写(使用匿名内部类等),或者如果您将其移动到插件中,则可以用Java编写。在这种特殊情况下,真正的挑战是理解事物的渐变方面:任务图API、配置与执行阶段,等等。您的解决方案运行良好。谢谢。对于您在P.S.中的注释:例如,当我使用
ciBuild jar
执行Gradle build时,我不能直接调用
isDevBuild()
(并且我不能同时使用这两个配置)-尽管你们表明我可以称之为“关闭”只是出于教育目的。多亏了看一下问题,所以:并不是所有的主要开发人员都将时间用于社区支持。
def onlyFor(task, config) {
    gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(task)) { 
            project.configure(project, config)
        }
    }
}
onlyFor(developerBuild) { ... }
onlyFor(ciBuild) { ... }