I have a custom task fixing whitespace issues in source files (code). The source files is both input and output to the task. I do not see how to combine the incremental input changes API together with input files also being the output files. Is there a way?
Currently the task works and is defined like this:
open class FixWhitespace : DefaultTask() {
@OutputFiles
lateinit var sourceFiles: FileTree
@TaskAction
fun fix() = ...
}
Only, when Gradle detects a change in one of the sourceFiles
the task is re-run and doing its whitespace-thing. Great! The BIG drawback is however that the task is applied to all sourceFiles
even if only one source file is modified.
I would like to take advantage of the incremental changes functionality in Gradle, only needing to apply the whitespace fixing to the source files actually changed, using something like this:
open class FixWhitespace : DefaultTask() {
@Incremental
@OutputFiles
lateinit var sourceFiles: FileTree
@TaskAction
fun fix(changes: InputChanges) = changes.getFileChanges(sourceFiles).forEach { ... }
}
However, this seems to be hard to get working. Combining the annotation @Incremental
and @OutputFiles
throws exception in method InputChanges.getFileChanges
:
> Cannot query incremental changes: No property found for value file tree. Incremental properties:
Instead, combining the annotation @Incremental
and @InputFiles
in sourceFiles
, seems to have strange effects in my case. It deletes all sourceFiles before running the task, if the current build run happens to be non-incremental. As specified in API, when a full rebuild happens “output files of the work are removed prior to executing the work action”. Further, the task needs some specified outputs in order to ever get UP-TO-DATE, right?
So, is there a way to use InputChanges
together with a FileTree
being both the input and the output to the task?
FYI: I’m running Gradle version 5.6.4