如何在Gradle任务上使用inputs.property,但是有一个值的闭包?

时间:2013-04-10 23:36:32

标签: gradle

我正在尝试将安装程序构建器添加到我的构建配置中,并且我在设置正确的任务输入时遇到了一些麻烦。我将配置拆分为单独的.gradle文件,然后通过执行以下操作将其添加到我的项目中。

project.ext.i4jArgs = [ "--verbose" ]
apply from: rootProject.projectDir.absolutePath + "/gradle/install4j.gradle"

要构建安装程序,我将通过exec调用命令行工具。几乎所有内容都基于约定,但我想在我的主构建文件中为命令添加一些参数/开关。我使用project.ext.i4jArgs属性(上图)来完成。

如果我在应用project.ext.i4jArgs文件之前设置install4j.gradle属性,我可以使用以下内容作为输入,一切似乎都有效。

inputs.property("i4jArgs", project.ext.has('i4jArgs') ? project.ext.i4jArgs : null)

但是,如果我先应用install4j.gradle文件并将project.ext.i4jArgs属性设置为第二个,那么当我在任务中声明输入时,project.ext.i4jArgs属性始终为null (明显)。 TaskInputs (here)的API说我可以将闭包作为值传递。有没有办法可以使用闭包来延迟project.ext.i4jArgs的评估,以保证它已被初始化?我虽然以下方法可行,但封闭永远不会被调用。

inputs.property("i4jArgs", {
    project.afterEvaluate {
        println "has args ${project.ext.has('i4jArgs')}"
        project.ext.has('i4jArgs') ? project.ext.i4jArgs : null
    }
})

我知道编写一个支持我想要的所有配置的插件对于我给出的具体示例可能是更好的选择,但是我想知道我在这里误解了什么。

1 个答案:

答案 0 :(得分:4)

我会在第一个闭包中删除project.afterEvaluate。这是为了添加一个在配置项目后执行的闭包。

实际发生的是当gradle解析输入时,它会调用第一个闭包,然后调用project.afterEvaluate,这会在项目完成配置时为列表添加一个闭包...永远不会被调用,因为它现在处于执行阶段。