在Gradle中并行化复制任务

问题描述 投票:1回答:2

我在Gradle 4版本中有以下任务:

task copyWsdlFromArtifacts(type: Copy) {
    includeEmptyDirs = false
    from((configurations.wsdlAndXsdSourcesCompile.files + configurations.wsdlAndXsdSources.files).collect { zipTree(it)})
    into "$buildDir/schema/"
    include '**/*.xsd', '**/*.wsdl'
}

现在这是一个瓶颈。有没有办法以某种方式并行化它?非常感谢你!

gradle build.gradle
2个回答
1
投票

这个任务在配置阶段做了很多“工作”,所有解压缩和计算每个解压缩文件的文件哈希。您可以通过使用拉链作为任务输入来提高性能,这意味着仅在任务不是UP-TO-DATE时才进行解压缩

例如:

task copyWsdlFromArtifacts {
    inputs.files configurations.wsdlAndXsdSourcesCompile
    inputs.files configurations.wsdlAndXsdSources
    outputs.dir "$buildDir/schema/"

    doLast {
        copy {
            includeEmptyDirs = false
            from((configurations.wsdlAndXsdSourcesCompile.files + configurations.wsdlAndXsdSources.files).collect { zipTree(it)})
            into "$buildDir/schema/"
            include '**/*.xsd', '**/*.wsdl'            
        }
    }
}

0
投票

我最终为每个工件创建一个任务并并行运行整个构建:

(configurations.wsdlAndXsdSourcesCompile.files + configurations.wsdlAndXsdSources.files).each { artifact ->
    tasks.create(name: "copyWsdlFromArtifacts$artifact", type: Copy) {
        from zipTree(artifact)
        into "$buildDir/schema/"
        include '**/*.xsd', '**/*.wsdl'
    }

    wsdl2java.dependsOn(tasks.findByName("copyWsdlFromArtifacts$artifact"))
}

希望它可以帮助某人

© www.soinside.com 2019 - 2024. All rights reserved.