3

我正在尝试将安装程序构建器添加到我的构建配置中,但在正确设置任务输入时遇到了一些麻烦。我将配置拆分为一个单独的 .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
    }
})

我知道编写一个支持我想要的所有配置的插件对于我给出的特定示例可能是一个更好的选择,但无论如何我想弄清楚我在这里误解了什么。

4

1 回答 1

4

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

project.afterEvaluate实际发生的情况是,当gradle解析输入时,它调用第一个闭包,然后调用现在处于执行阶段。

于 2013-04-11T15:37:39.967 回答