有没有一种方法可以让我很容易地在gradle任务中智能地处理FileTree文件?我基本上需要等待所有文件的执行,就像你可以用GPars做的那样,但是我怎么用FileTree来做这个呢?
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)这样的事情,那就太好了,但我在谷歌上搜索了一下,什么也没找到。有没有一种方法可以很容易地让它成为多线程的?一个元素的处理不会影响任何其他元素的处理。
发布于 2011-09-01 11:41:22
在考虑使用多线程之前,我会尝试以下方法:
如果这仍然让你对性能不满意,并且你不能使用性能更好的minifier,你仍然可以尝试多线程。Gradle不会在这方面帮到你,但是像GPars或Java Fork/Join框架这样的库会帮到你。
发布于 2011-09-02 11:26:02
GPars解决方案。请注意,可以修改compress()函数以正确接受源目录/目标目录/等,但由于我所有的名称都是一致的,所以我现在只使用一个参数。我能够将我的构建时间从7.3s缩短到5.4s,并且只缩减了3个文件。我见过构建时间失控,所以我总是对这种行为的性能保持警惕。
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')
}
}https://stackoverflow.com/questions/7264927
复制相似问题