Gradle Goodness: Handle Copying Duplicate Files
In Gradle we can configure how duplicate files should be handled by the Copy
task. Actually we can configure how duplicate files are handled by any task that implements the CopySpec
interface. For example archive tasks also implements this interface. We must use the setDuplicatesStrategy
method to configure how Gradle behaves. The parameter is a value of the enumeration DuplicatesStrategy
. We can use the values from the enum class or use String
values, which are automatically converted to enum DuplicatesStrategy
values.
We can choose the following strategies:
- include: default strategy where the last duplicate file ‘wins’.
- exclude: only the first found duplicate file is copied and ‘wins’.
- warn: shows a warning on the console, but the last duplicate file ‘wins’ like with the include strategy.
- fail: the build fails where duplicate files are found.
The following build file create four task of type Copy
, each with a different duplicate strategy. In the directories src/manual
and src/website
we have a file COPY.txt
. The content is simply a text line respectively COPY from src/manual
and COPY from src/website
:
// For each duplicate strategy we create a copy task. ['warn', 'include', 'exclude', 'fail'].each { strategy -> task "copyDuplicatesStrategy${strategy.capitalize()}"(type: Copy) { from 'src/manual' from 'src/webroot' into "$buildDir/copy" // Only the value for this property differs for // each created task. duplicatesStrategy = strategy // Print the used duplicates strategy when // the task starts. doFirst { println "Copying with duplicates strategy '${strategy}'." } // Print the contents of the copied file COPY.txt. doLast { println "Contents of COPY.txt:" println file("$buildDir/copy/COPY.txt").text } } }
We can now invoke the four tasks and see how Gradle reacts:
$ gradle copyDuplicatesStrategyWarn :copyDuplicatesStrategyWarn Copying with duplicates strategy 'warn'. Encountered duplicate path "COPY.txt" during copy operation configured with DuplicatesStrategy.WARN Contents of COPY.txt: COPY from src/webroot BUILD SUCCESSFUL Total time: 3.728 secs
$ gradle copyDuplicatesStrategyInclude :copyDuplicatesStrategyInclude Copying with duplicates strategy 'include'. Contents of COPY.txt: COPY from src/webroot BUILD SUCCESSFUL Total time: 2.744 secs
$ gradle copyDuplicatesStrategyExclude :copyDuplicatesStrategyExclude Copying with duplicates strategy 'exclude'. Contents of COPY.txt: COPY from src/manual BUILD SUCCESSFUL Total time: 2.784 secs
$ gradle copyDuplicatesStrategyFail :copyDuplicatesStrategyFail Copying with duplicates strategy 'fail'. :copyDuplicatesStrategyFail FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':copyDuplicatesStrategyFail'. > Encountered duplicate path "COPY.txt" during copy operation configured with DuplicatesStrategy.FAIL * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 2.786 secs
Written with Gradle 2.3.
Reference: | Gradle Goodness: Handle Copying Duplicate Files from our JCG partner Hubert Ikkink at the JDriven blog. |