Sometimes you need to defer configuration to be done just before task execution because the information required for configuration is specified in other scripts (or by depenedent tasks). Consider the task when you want to create a javadoc from all the sources of every subprojects.
Currently the best solution I have found is this:
task mergedJavadoc(type: Javadoc, dependsOn: ‘mergedJavadocConfig’) {
}
task mergedJavadocConfig doLast {
project.subprojects {
mergedJavadoc.source(sourceSets.main.allSource);
}
mergedJavadoc.title = ‘All modules’;
mergedJavadoc.destinationDir = new File(project.buildDir, ‘merged-javadoc’);
}
I have tried the following but it does not work:
task mergedJavadoc(type: Javadoc) {
}
mergedJavadoc.doFirst {
project.subprojects {
mergedJavadoc.source(sourceSets.main.allSource);
}
mergedJavadoc.title = ‘All modules’;
mergedJavadoc.destinationDir = new File(project.buildDir, ‘merged-javadoc’);
}
The above code will not produce anything but attempting to execute ‘mergedJavadoc’ will simply report that it is “up to date”.
My prefered solution would be however if something like this would be possible:
task mergedJavadoc(type: Javadoc) configureLater {
project.subprojects {
mergedJavadoc.source(sourceSets.main.allSource);
}
mergedJavadoc.title = ‘All modules’;
mergedJavadoc.destinationDir = new File(project.buildDir, ‘merged-javadoc’);
}
Where ‘configureLater’ would simply defer the configuration until ‘mergedJavadoc’ is to be executed (and before it checks if it is up to date). Theoretically this could alse improve performance since tasks not executed does not need to be configured (although probably this performance gain is negligable).