How do I concatenate multiple files in Gradle?

2019-04-30 04:04发布

问题:

Is there an easy way to concatenate multiple text files into a single one in Gradle? The build script should look something like this:

FileCollection jsDeps = files(
   'file1.js',
   'file2.js'
   // other files here
)

task concatenate << {
   // concatenate the files to file.js
}

I am using Gradle 2.3.

回答1:

(new File('test.js')).text = file('test1.js').getText() + file('test2.js').getText()

UPDATE:

For collections.

(new File('test.js')).text = files('test1.js', 'test2.js').collect{it.getText()}.join("\n")


回答2:

The following task should do the job:

task concatenate << {
    def toConcatenate = files('f1', 'f2', 'f3')
    def output = new File('output')
    toConcatenate.each { f -> output << f.text }
}


回答3:

leftShift / "<<" is deprecated in gradle 3.4 You may use something like:

task concatenate {
    doLast {
        def toConcatenate = files("filename1", "filename2", ...)
        def outputFileName = "output.txt"
        def output = new File(outputFileName)
        output.write('') // truncate output if needed
        toConcatenate.each { f -> output << f.text }
    }


回答4:

You can also register the files as inputs/outputs to help with incremental builds. It's especially helpful with larger files.

something like this:

task 'concatenateFiles', {
    inputs.files( fileTree( "path/to/dir/with/files" ) ).skipWhenEmpty()
    outputs.file( "$project.buildDir/tmp/concatinated.js" )
    doLast {
        outputs.files.singleFile.withOutputStream { out ->
            for ( file in inputs.files ) file.withInputStream { out << it << '\n' }
        }
    }
}

Instead of the fileTree, it can also be replaced with sourceset/sourceset output, specific files, outputs from a different task, etc.

Gradle doc on task inputs/output

Concatenating files in groovy



标签: gradle