有没有办法可以轻松地在gradle任务中以智能方式处理FileTree
个文件?我基本上需要等待所有文件的执行,就像你可以用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)
这样的事情,那将是可爱的,但我的谷歌搜索没有任何结果。有没有办法可以轻松制作这种多线程?处理一个元素对任何其他元素的处理没有影响。
答案 0 :(得分:3)
在考虑进行多线程之前,我会尝试以下方法:
如果这仍然让您对性能不满意,并且您无法使用性能更高的缩放器,您仍然可以尝试使用多线程。 Gradle将不会帮助你(但是),但像GPars或Java Fork / Join框架这样的库会。
答案 1 :(得分:1)
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')
}
}