Skip to content

Commit 048ab77

Browse files
Update RewritePlugin to load tasks lazily (#326)
Motivation ---------- The current structure of RewritePlugin eagerly loads the RewriteRun, RewriteDryRun, and RewriteDiscover tasks. This is a problem in Gradle builds with a large number of modules, as it has to create hundreds or even thousands of tasks during configuration. This will happen even if the tasks are not used in that run. This commit updates the plugin by lazily loading these tasks to avoid this issue. Modifications ------------- The RewritePlugin was changed to call the register() method instead of the create() method for the three tasks. This method takes a configuration lambda where the existing configuration can be done. Next, the tasks' usages were replaced with the equivalent TaskProvider reference. Finally, fetching the appropriate JavaCompile tasks was updated to use a lazy load method (named()), so those tasks are not eagerly created. The plugin's Gradle version was unchanged and should still support Gradle 4.10. Result ------ The result is a RewritePlugin that no longer eagerly loads its tasks. It is now safe to use in very large builds.
1 parent f908308 commit 048ab77

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

plugin/src/main/java/org/openrewrite/gradle/RewritePlugin.java

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.gradle.api.plugins.quality.CheckstylePlugin;
3232
import org.gradle.api.provider.Provider;
3333
import org.gradle.api.tasks.SourceSetContainer;
34+
import org.gradle.api.tasks.TaskProvider;
3435

3536
import java.io.File;
3637
import java.util.Comparator;
@@ -70,20 +71,23 @@ public void apply(Project project) {
7071

7172
Provider<Set<File>> resolvedDependenciesProvider = project.provider(() -> getResolvedDependencies(project, extension, rewriteConf));
7273

73-
RewriteRunTask rewriteRun = project.getTasks().create("rewriteRun", RewriteRunTask.class)
74-
.setExtension(extension)
75-
.setResolvedDependencies(resolvedDependenciesProvider);
76-
rewriteRun.dependsOn(rewriteConf);
74+
TaskProvider<RewriteRunTask> rewriteRun = project.getTasks().register("rewriteRun", RewriteRunTask.class, task -> {
75+
task.setExtension(extension);
76+
task.setResolvedDependencies(resolvedDependenciesProvider);
77+
task.dependsOn(rewriteConf);
78+
});
7779

78-
RewriteDryRunTask rewriteDryRun = project.getTasks().create("rewriteDryRun", RewriteDryRunTask.class)
79-
.setExtension(extension)
80-
.setResolvedDependencies(resolvedDependenciesProvider);
81-
rewriteDryRun.dependsOn(rewriteConf);
80+
TaskProvider<RewriteDryRunTask> rewriteDryRun = project.getTasks().register("rewriteDryRun", RewriteDryRunTask.class, task -> {
81+
task.setExtension(extension);
82+
task.setResolvedDependencies(resolvedDependenciesProvider);
83+
task.dependsOn(rewriteConf);
84+
});
8285

83-
RewriteDiscoverTask rewriteDiscover = project.getTasks().create("rewriteDiscover", RewriteDiscoverTask.class)
84-
.setExtension(extension)
85-
.setResolvedDependencies(resolvedDependenciesProvider);
86-
rewriteDiscover.dependsOn(rewriteConf);
86+
TaskProvider<RewriteDiscoverTask> rewriteDiscover = project.getTasks().register("rewriteDiscover", RewriteDiscoverTask.class, task -> {
87+
task.setExtension(extension);
88+
task.setResolvedDependencies(resolvedDependenciesProvider);
89+
task.dependsOn(rewriteConf);
90+
});
8791

8892
if (isRootProject) {
8993
project.allprojects(subproject -> configureProject(subproject, extension, rewriteDryRun, rewriteRun));
@@ -92,7 +96,7 @@ public void apply(Project project) {
9296
}
9397
}
9498

95-
private static void configureProject(Project project, RewriteExtension extension, RewriteDryRunTask rewriteDryRun, RewriteRunTask rewriteRun) {
99+
private static void configureProject(Project project, RewriteExtension extension, TaskProvider<RewriteDryRunTask> rewriteDryRun, TaskProvider<RewriteRunTask> rewriteRun) {
96100
// DomainObjectCollection.all() accepts a function to be applied to both existing and subsequently added members of the collection
97101
// Do not replace all() with any form of collection iteration which does not share this important property
98102
project.getPlugins().all(plugin -> {
@@ -119,9 +123,9 @@ private static void configureProject(Project project, RewriteExtension extension
119123
}
120124
sourceSets.all(sourceSet -> {
121125
// This is intended to ensure that any Groovy/Kotlin/etc. and dependent project sources are available
122-
Task compileTask = project.getTasks().getByPath(sourceSet.getCompileJavaTaskName());
123-
rewriteRun.dependsOn(compileTask);
124-
rewriteDryRun.dependsOn(compileTask);
126+
TaskProvider<Task> compileTask = project.getTasks().named(sourceSet.getCompileJavaTaskName());
127+
rewriteRun.configure(task -> task.dependsOn(compileTask));
128+
rewriteDryRun.configure(task -> task.dependsOn(compileTask));
125129
});
126130

127131
// Detect SourceSets which overlap other sourceSets and disable the compilation task of the overlapping
@@ -139,8 +143,8 @@ private static void configureProject(Project project, RewriteExtension extension
139143
})).forEach(sourceSet -> {
140144
for (File file : sourceSet.getAllJava().getSourceDirectories().getFiles()) {
141145
if (!sourceDirs.add(file.getAbsolutePath())) {
142-
Task compileTask = project.getTasks().getByPath(sourceSet.getCompileJavaTaskName());
143-
compileTask.setEnabled(false);
146+
TaskProvider<Task> compileTask = project.getTasks().named(sourceSet.getCompileJavaTaskName());
147+
compileTask.configure(task -> task.setEnabled(false));
144148
}
145149
}
146150
}));

0 commit comments

Comments
 (0)