通过Gradle中的@Nested缓存对象列表

时间:2016-11-22 15:15:52

标签: gradle groovy

我有一个自定义Gradle任务,它为项目生成一个简单的JNLP,并使任务增量失败。虽然使用@Nested注释的特定域对象导致任务在更改时过期,但域对象集合不起作用。

首先,这就是构建脚本中的任务:

task jnlp(type: JnlpTask) {

    information {
        title = "My Project"
        vendor = "ACME Inc."
        homepage = "index.html"
    }

    application {
        mainClass = "com.acme.project.MainFrame"
        args = [443, "administration"]
    }

    resources {
        j2se version:"1.7+", maxHeapSize:"256M", initialHeapSize:"32M", vmArgs:"-Dfile.encoding=Cp850"
        jar href: "project.jar", main:true
        jar href: "lib.jar", download: "eager"
    }

    resources(os: "Windows", arch:"x64") {
        nativelib href: "winlib-native-64.jar", download: "eager"
    }
}

这是任务实现本身:

package com.acme.build

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.InputDirectory;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Nested

class JnlpTask extends DefaultTask {

    @Nested
    ApplicationDescription appDesc

    @Input
    Map<String, String> information = [:]

    @Nested
    List<JnlpResourceContainer> resources = []

    @TaskAction
    def writeJnlp() {
        new XmlWriter().write(this)
    }

    def application(Closure cl) {
        appDesc = new ApplicationDescription()
        apply appDesc, cl
    }

    def information(Closure cl) {
        apply information, cl
    }

    def resources(Map params = [:], Closure cl) {
        def container = new JnlpResourceContainer()
        container.setParams(params)
        apply container, cl
        resources << container
    }

    def apply(def object, Closure cl) {
        cl.delegate = object
        cl.resolveStrategy = Closure.DELEGATE_FIRST
        cl()
    }
}

使用ApplicationDescription对象的更改,即修改application部分中的参数时。但是当我 resources 部分添加库时,构建仍然标记为最新,尽管JnlpResourceContainer中的属性是使用适当的缓存类型进行注释(类Resource仅使用@Input仅注释两个属性:

package com.acme.build

import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Nested

class JnlpResourceContainer {

    @Nested
    List<Resource> resources = []

    @Input
    Map params = [:]

    def j2se(Map params) {
        addResource('j2se', params)
    }

    def jar(Map params) {
        addResource('jar', params)
    }

    def nativelib(Map params) {
        addResource('nativelib', params)
    }

    def addResource(String type, Map params) {
        def resource = new Resource()
        resource.setType(type)

        params.each() {k,v ->
            k = k.replaceAll(/([A-Z])/, /-$1/).toLowerCase()
            resource.params[k] = v
        }

        resources << resource
    }

}

编辑在对资源部分进行更改后,使用info标志运行任务会输出以下内容:

$ ./gradlew :jnlp -i
[...]
All projects evaluated.
Selected primary task 'jnlp' from project :
Tasks to be executed: [task ':jnlp']
In-memory cache of .gradle\3.2\taskArtifacts\fileHashes.bin: Size{1}, CacheStats{hitCount=30, missCount=3, loadSuccessCount=3, loadExceptionCount=0, totalLoadTime=3020
680, evictionCount=0}
In-memory cache of .gradle\3.2\taskArtifacts\fileSnapshots.bin: Size{22}, CacheStats{hitCount=61, missCount=10, loadSuccessCount=10, loadExceptionCount=0, totalLoadTim
e=7833757, evictionCount=0}
In-memory cache of .gradle\3.2\taskArtifacts\taskArtifacts.bin: Size{2}, CacheStats{hitCount=42, missCount=7, loadSuccessCount=7, loadExceptionCount=0, totalLoadTime=1
0416051, evictionCount=0}
:jnlp (Thread[Daemon worker Thread 12,5,main]) started.
:jnlp
Putting task artifact state for task ':jnlp' into context took 0.0 secs.
Task :jnlp class loader hash: 4ac466ecfcbf121c122b8a3606907b63
Task :jnlp actions class loader hash: b9107ff7ae23d58476c42a44166b6e68
Skipping task ':jnlp' as it is up-to-date (took 0.001 secs).
:jnlp UP-TO-DATE
:jnlp (Thread[Daemon worker Thread 12,5,main]) completed. Took 0.001 secs.

由于我是Gradle的新手,尤其是Groovy,我们对任何改进和建议表示赞赏。

提前感谢您的帮助!

0 个答案:

没有答案