Gradle副本和过滤器任务未执行

时间:2016-05-09 15:01:27

标签: gradle

我们正在过滤一个xml文件,用gradle属性替换一些令牌。

但是当我们只更改build.gradle文件中的属性时,不会执行过滤(即复制任务)。

我们应该如何修改脚本,以便每次或至少在修改模板和/或build.gradle时执行过滤。

我们有:

war.doFirst {
   delete 'src/main/webapp/WEB-INF/appengine-web.xml'

   copy {
        from 'build.gradle'
        from 'src/main/webapp/WEB-INF/'
        into 'src/main/webapp/WEB-INF/'
        include '*-template.*'

        rename { String fileName ->
            fileName.replace('-template', '')
        }

        expand(gaeApp: "$gaeApp", gaeAppVersion: "$gaeAppVersion")
    }
}

我刚刚进行了一些过滤工作的测试。我很困惑......我确信它有时不会!

所以经过吸血鬼的好评,我们尝试了这个

war {
    inputs.file "build.gradle"

    exclude 'src/main/webapp/WEB-INF/appengine-web.xml'

    // filesMatching('src/main/webapp/WEB-INF/**/*-template.*') {
    filesMatching('**/*-template.*') {

        println "WAR template: $it"

       rename { it.replace '-template', '' }
       expand gaeApp: gaeApp, gaeAppVersion: gaeAppVersion
    }
}

任何可以解释为什么filesMatching('src/main/webapp/WEB-INF/**/*-template.*')不起作用的人都可以获得一美元和一角钱!

但最大的问题是即使filesMatching找到模板文件,放在WAR中的appengine-web.xml也不是appengine-web-template.xml的处理版本。

2 个答案:

答案 0 :(得分:0)

您需要将这些属性添加到任务的输入中,如

TaskCompletionSource,

以便gradle知道输入已更改,否则无法知道输入何时不同。

但除此之外,你不应该(不必)在那里使用war.inputs.property 'gaeApp', gaeApp war.inputs.property 'gaeAppVersion', gaeAppVersion 块。 copy { }任务本身是隐式复制规范,因此您应该能够执行类似

的操作
war

答案 1 :(得分:0)

这最终对我们有用。

我们将模板移动到'src / template / webapp'并删除了“-template”后缀,

war {
    inputs.file "build.gradle"
    with copySpec {
        from 'src/template/webapp' 
        expand gaeApp: gaeApp, gaeAppVersion: gaeAppVersion
    } 
}

我们与吸血鬼解决方案的问题必须与模板文件与要替换的文件位于同一目录中的事实有关。