Gradle Goodness: Add Incremental Build Support to Custom Tasks with Annotations
In a previous post we learned how we can use the inputs and outputs properties to set properties or files that need to be checked to see if a task is up to date. In this post we learn how a custom task class can use annotations to set input properties, file or files and output files or dir.
For input we can use @Input
, @InputFile
, @InputFiles
or @InputDirectory
annotations. Gradle uses the properties with annotations for checking if a task is up to date. Output file or directory can be marked with @OutputFile
and @OutputDirectory
.
00.
task generateVersionFile(type: Generate) {
01.
version =
'2.0'
02.
outputFile = file(
"$project.buildDir/version.txt"
)
03.
}
04.
05.
task showContents << {
06.
println
generateVersionFile.outputFile.text
07.
}
08.
showContents.dependsOn generateVersionFile
09.
10.
class
Generate
extends
DefaultTask {
11.
@Input
12.
String version
13.
14.
@OutputFile
15.
File outputFile
16.
17.
@TaskAction
18.
void
generate() {
19.
def
file = getOutputFile()
20.
if
(!file.isFile()) {
21.
file.parentFile.mkdirs()
22.
file.createNewFile()
23.
}
24.
file.
write
"Version: ${getVersion()}"
25.
}
26.
}
We can run our task and get the following output:
$ gradle showContents
:generateVersionFile
:showContents
Version: 2.0
BUILD SUCCESSFUL
And if we run it again we see the task is now up to date:
$ gradle showContents
:generateVersionFile UP-TO-DATE
:showContents
Version: 2.0
BUILD SUCCESSFUL
We can change the version numer in our build script to 2.1 and see the output:
$ gradle showContents
:generateVersionFile
:showContents
Version: 2.1
BUILD SUCCESSFUL