2

有没有一种方法可以轻松地FileTree在 gradle 任务中以智能方式处理文件?我基本上需要等待所有文件的执行,就像你可以用 GPars 做的一样,但是我如何用 FileTree 做这个 gradle?

task compressJs(dependsOn: [copyJsToBuild]) << {
    println 'Minifying JS'

    fileTree {
        from 'build/js'
        include '**/*.js'
    }.visit { element ->
        if (element.file.isFile()) {
            println "Minifying ${element.relativePath}"
            ant.java(jar: "lib/yuicompressor-2.4.6.jar", fork: true) {
                arg(value: "build/js/${element.relativePath}")
                arg(value: "-o")
                arg(value: "build/js/${element.relativePath}")
            }
        }
    }
}

如果我能做类似的事情会很可爱.visit{}.async(wait:true),但我的谷歌搜索却一无所获。有没有办法可以轻松地使这个多线程?一个元素的处理对任何其他元素的处理没有影响。

4

2 回答 2

3

在考虑使用多线程之前,我会尝试以下方法:

  • 在同一个 JVM 中运行所有内容。为每个输入文件派生一个新的 JVM 是非常低效的。
  • 使 compressJs 任务增量,以便仅当某些输入文件自上次运行以来发生更改时才执行。
  • 直接运行压缩程序,而不是通过 Ant(保存为每个输入文件创建新的类加载器;不确定是否重要)。

如果这仍然让您对性能不满意,并且您不能使用性能更高的缩小器,您仍然可以尝试使用多线程。Gradle 不会帮助你(现在),但是像 GPars 或 Java Fork/Join 框架这样的库会。

于 2011-09-01T03:41:21.843 回答
1

GPars 解决方案。请注意,compress()可以修改该函数以正确接受源目录/目标目录/等,但由于我所有的名称都是一致的,所以我现在只使用一个参数。我只需要缩小 3 个文件7.3s就可以缩短构建时间。5.4s我已经看到构建时间失控了,所以我总是对这种行为的性能保持警惕。

import groovyx.gpars.GParsPool

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.codehaus.gpars:gpars:0.12'
    }
}

def compress(String type) {
    def elementsToMinify = []
    fileTree {
        from type
        include "**/*.$type"
    }.visit { element ->
        if (element.file.isFile()) {
            elementsToMinify << element
        }
    }

    GParsPool.withPool(8) {
        elementsToMinify.eachParallel { element ->
            println "Minifying ${element.relativePath}"
            def outputFileLocation = "build/$type/${element.relativePath}"
            new File(outputFileLocation).parentFile.mkdirs()
            ant.java(jar: "lib/yuicompressor-2.4.6.jar", fork: true) {
                arg(value: "$type/${element.relativePath}")
                arg(value: "-o")
                arg(value: outputFileLocation)
            }
        }
    }
}

task compressJs {
    inputs.dir new File('js')
    outputs.dir new File('build/js')

    doLast {
        compress('js')
    }
}

task compressCss {
    inputs.dir new File('css')
    outputs.dir new File('build/css')

    doLast {
       compress('css')
    }
}
于 2011-09-02T03:26:02.440 回答