2

FileTreeGradleタスクでスマートな方法でファイルを簡単に処理できる方法はありますか?基本的に、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)が、グーグルは何も起こりませんでした。これを簡単にマルチスレッドにする方法はありますか?1つの要素の処理は、他の要素の処理には影響しません。

4

2 に答える 2

3

マルチスレッド化を検討する前に、次のことを試してみます。

  • すべてを同じJVMで実行します。入力ファイルごとに新しいJVMをフォークすることは、非常に非効率的です。
  • compressJsタスクをインクリメンタルにして、前回の実行以降に入力ファイルが変更された場合にのみ実行されるようにします。
  • Antを介してではなく、直接ミニファイアを実行します(入力ファイルごとに新しいクラスローダーの作成を保存します。重要かどうかはわかりません)。

それでもパフォーマンスに不満があり、よりパフォーマンスの高いミニファイアを使用できない場合でも、マルチスレッド化を試みることができます。Gradleは(まだ)あなたを助けませんが、GParsやJava Fork/Joinフレームワークのようなライブラリは助けになります。

于 2011-09-01T03:41:21.843 に答える
1

GParsソリューション。compress()ソースディレクトリ/ターゲットディレクトリなどを適切に受け入れるように関数を変更できることに注意してください。ただし、すべての名前が一貫しているため、今のところ1つの引数を使用しています。最小化されたファイルは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 に答える