knst
knst

Reputation: 533

Refactor duplicated code in gradle task "type: Copy"

A gradle project contains several similar task type:Copy and some of them require additional checks.

task copyPackage1(type: Copy) {
    from buildPackage1
    into "/pkgs/"
    eachFile {
        if (it.relativePath.getFile(destinationDir).exists()) {
            throw new GradleException("Probably version was no updated. File exists: " + it)
        }
    }
}
...
task copyPackage2(type: Copy) {
    from buildPackage2
    into "/pkgs/"
    eachFile {
        if (it.relativePath.getFile(destinationDir).exists()) {
            throw new GradleException("Probably version was no updated. File exists: " + it)
        }
    }
}

How it is possible to refactor duplicated checks and specify same target directory for all similar tasks (but not all Copy tasks)?

Upvotes: 0

Views: 254

Answers (1)

M.Ricciuti
M.Ricciuti

Reputation: 12116

You could either implement this with a custom Gradle plugin (as suggested in this similar question on Gradle forum), or use simple Groovy method to create and configure your tasks, as follows:

// define a "task creator" method 
ext.createCopyToPkgTask = { String taskName ,  String fromDir ->
    return project.tasks.create(taskName, Copy.class){
        from fromDir
        into "/pkgs"
        eachFile {
            if (it.relativePath.getFile(destinationDir).exists()) {
                throw new GradleException("Probably version was no updated. File exists: " + it)
            }
        }
    }
}

/* declare your similar tasks using the creator method above */
createCopyToPkgTask("copyPackage1","buildPackage1")
createCopyToPkgTask("copyPackage2","buildPackage2")
// ...

Upvotes: 2

Related Questions