Skip to content

Commit 2db467e

Browse files
committed
[Build] Make DependenciesInfoPlugin configuration cache compatible
We can now run projects check tasks and :distribution:generateDependenciesReport with configuration cache enabled (--configuration-cache)
1 parent d9b34d4 commit 2db467e

File tree

2 files changed

+63
-62
lines changed

2 files changed

+63
-62
lines changed

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/DependenciesInfoPlugin.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ public void apply(final Project project) {
2828
var depsInfo = project.getTasks().register("dependenciesInfo", DependenciesInfoTask.class);
2929

3030
depsInfo.configure(t -> {
31-
t.setRuntimeConfiguration(project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME));
32-
t.setCompileOnlyConfiguration(
33-
project.getConfigurations().getByName(CompileOnlyResolvePlugin.RESOLVEABLE_COMPILE_ONLY_CONFIGURATION_NAME)
34-
);
35-
t.getConventionMapping().map("mappings", () -> {
36-
var depLic = project.getTasks().named("dependencyLicenses", DependencyLicensesTask.class);
37-
return depLic.get().getMappings();
38-
});
31+
var runtimeConfiguration = project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
32+
t.getRuntimeArtifacts().set(project.getProviders().provider(() -> runtimeConfiguration.getIncoming().getArtifacts()));
33+
t.getClasspath().from(runtimeConfiguration);
34+
var compileOnlyConfiguration = project.getConfigurations()
35+
.getByName(CompileOnlyResolvePlugin.RESOLVEABLE_COMPILE_ONLY_CONFIGURATION_NAME);
36+
t.getCompileOnlyArtifacts().set(project.getProviders().provider(() -> compileOnlyConfiguration.getIncoming().getArtifacts()));
37+
t.getClasspath().from(compileOnlyConfiguration);
38+
3939
});
4040
Configuration dependenciesInfoFilesConfiguration = project.getConfigurations().create("dependenciesInfoFiles");
4141
dependenciesInfoFilesConfiguration.setCanBeResolved(false);

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/DependenciesInfoTask.java

Lines changed: 55 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,22 @@
1111

1212
import org.elasticsearch.gradle.internal.precommit.DependencyLicensesTask;
1313
import org.elasticsearch.gradle.internal.precommit.LicenseAnalyzer;
14-
import org.gradle.api.artifacts.Configuration;
15-
import org.gradle.api.artifacts.Dependency;
16-
import org.gradle.api.artifacts.DependencySet;
17-
import org.gradle.api.artifacts.ModuleVersionIdentifier;
14+
import org.gradle.api.artifacts.ArtifactCollection;
1815
import org.gradle.api.artifacts.ProjectDependency;
16+
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
17+
import org.gradle.api.file.ConfigurableFileCollection;
1918
import org.gradle.api.file.DirectoryProperty;
2019
import org.gradle.api.file.ProjectLayout;
2120
import org.gradle.api.internal.ConventionTask;
2221
import org.gradle.api.model.ObjectFactory;
22+
import org.gradle.api.provider.MapProperty;
23+
import org.gradle.api.provider.Property;
24+
import org.gradle.api.provider.Provider;
2325
import org.gradle.api.provider.ProviderFactory;
2426
import org.gradle.api.tasks.Input;
2527
import org.gradle.api.tasks.InputDirectory;
2628
import org.gradle.api.tasks.InputFiles;
29+
import org.gradle.api.tasks.Internal;
2730
import org.gradle.api.tasks.Optional;
2831
import org.gradle.api.tasks.OutputFile;
2932
import org.gradle.api.tasks.TaskAction;
@@ -34,6 +37,7 @@
3437
import java.nio.file.StandardOpenOption;
3538
import java.util.Arrays;
3639
import java.util.LinkedHashMap;
40+
import java.util.Map;
3741
import java.util.Set;
3842
import java.util.regex.Pattern;
3943
import java.util.stream.Collectors;
@@ -51,31 +55,48 @@
5155
* <li>license: <a href="https://spdx.org/licenses/">SPDX license</a> identifier, custom license or UNKNOWN.</li>
5256
* </ul>
5357
*/
54-
public class DependenciesInfoTask extends ConventionTask {
58+
public abstract class DependenciesInfoTask extends ConventionTask {
5559

56-
private final DirectoryProperty licensesDir;
57-
58-
@OutputFile
59-
private File outputFile;
60+
@Inject
61+
public abstract ProviderFactory getProviderFactory();
6062

61-
private LinkedHashMap<String, String> mappings;
63+
@Internal
64+
abstract Property<ArtifactCollection> getRuntimeArtifacts();
6265

63-
public Configuration getRuntimeConfiguration() {
64-
return runtimeConfiguration;
66+
@Input
67+
public Provider<Set<ModuleComponentIdentifier>> getRuntimeModules() {
68+
return mapToModuleComponentIdentifiers(getRuntimeArtifacts().get());
6569
}
6670

67-
public void setRuntimeConfiguration(Configuration runtimeConfiguration) {
68-
this.runtimeConfiguration = runtimeConfiguration;
69-
}
71+
@Internal
72+
abstract Property<ArtifactCollection> getCompileOnlyArtifacts();
7073

71-
public Configuration getCompileOnlyConfiguration() {
72-
return compileOnlyConfiguration;
74+
@Input
75+
public Provider<Set<ModuleComponentIdentifier>> getCompileOnlyModules() {
76+
return mapToModuleComponentIdentifiers(getCompileOnlyArtifacts().get());
7377
}
7478

75-
public void setCompileOnlyConfiguration(Configuration compileOnlyConfiguration) {
76-
this.compileOnlyConfiguration = compileOnlyConfiguration;
79+
@InputFiles
80+
abstract ConfigurableFileCollection getClasspath();
81+
82+
private Provider<Set<ModuleComponentIdentifier>> mapToModuleComponentIdentifiers(ArtifactCollection artifacts) {
83+
return getProviderFactory().provider(
84+
() -> artifacts.getArtifacts()
85+
.stream()
86+
.map(r -> r.getId())
87+
.filter(id -> id instanceof ModuleComponentIdentifier)
88+
.map(id -> (ModuleComponentIdentifier) id)
89+
.collect(Collectors.toSet())
90+
);
7791
}
7892

93+
private final DirectoryProperty licensesDir;
94+
95+
@OutputFile
96+
private File outputFile;
97+
98+
private LinkedHashMap<String, String> mappings;
99+
79100
/**
80101
* Directory to read license files
81102
*/
@@ -102,17 +123,6 @@ public void setOutputFile(File outputFile) {
102123
this.outputFile = outputFile;
103124
}
104125

105-
/**
106-
* Dependencies to gather information from.
107-
*/
108-
@InputFiles
109-
private Configuration runtimeConfiguration;
110-
/**
111-
* We subtract compile-only dependencies.
112-
*/
113-
@InputFiles
114-
private Configuration compileOnlyConfiguration;
115-
116126
@Inject
117127
public DependenciesInfoTask(ProjectLayout projectLayout, ObjectFactory objectFactory, ProviderFactory providerFactory) {
118128
this.licensesDir = objectFactory.directoryProperty();
@@ -123,22 +133,18 @@ public DependenciesInfoTask(ProjectLayout projectLayout, ObjectFactory objectFac
123133

124134
@TaskAction
125135
public void generateDependenciesInfo() throws IOException {
126-
final DependencySet runtimeDependencies = runtimeConfiguration.getAllDependencies();
127-
// we have to resolve the transitive dependencies and create a group:artifactId:version map
128-
129-
final Set<String> compileOnlyArtifacts = compileOnlyConfiguration.getResolvedConfiguration()
130-
.getResolvedArtifacts()
131-
.stream()
132-
.map(r -> {
133-
ModuleVersionIdentifier id = r.getModuleVersion().getId();
134-
return id.getGroup() + ":" + id.getName() + ":" + id.getVersion();
135-
})
136-
.collect(Collectors.toSet());
137136

137+
final Set<String> compileOnlyIds = getCompileOnlyModules().map(
138+
set -> set.stream()
139+
.map(id -> id.getModuleIdentifier().getGroup() + ":" + id.getModuleIdentifier().getName() + ":" + id.getVersion())
140+
.collect(Collectors.toSet())
141+
).get();
138142
final StringBuilder output = new StringBuilder();
139-
for (final Dependency dep : runtimeDependencies) {
143+
Map<String, String> mappings = getMappings().get();
144+
for (final ModuleComponentIdentifier dep : getRuntimeModules().get()) {
140145
// we do not need compile-only dependencies here
141-
if (compileOnlyArtifacts.contains(dep.getGroup() + ":" + dep.getName() + ":" + dep.getVersion())) {
146+
String moduleName = dep.getModuleIdentifier().getName();
147+
if (compileOnlyIds.contains(dep.getGroup() + ":" + moduleName + ":" + dep.getVersion())) {
142148
continue;
143149
}
144150

@@ -147,25 +153,20 @@ public void generateDependenciesInfo() throws IOException {
147153
continue;
148154
}
149155

150-
final String url = createURL(dep.getGroup(), dep.getName(), dep.getVersion());
151-
final String dependencyName = DependencyLicensesTask.getDependencyName(getMappings(), dep.getName());
152-
getLogger().info("mapped dependency " + dep.getGroup() + ":" + dep.getName() + " to " + dependencyName + " for license info");
156+
final String url = createURL(dep.getGroup(), moduleName, dep.getVersion());
157+
final String dependencyName = DependencyLicensesTask.getDependencyName(mappings, moduleName);
158+
getLogger().info("mapped dependency " + dep.getGroup() + ":" + moduleName + " to " + dependencyName + " for license info");
153159

154160
final String licenseType = getLicenseType(dep.getGroup(), dependencyName);
155-
output.append(dep.getGroup() + ":" + dep.getName() + "," + dep.getVersion() + "," + url + "," + licenseType + "\n");
161+
output.append(dep.getGroup() + ":" + moduleName + "," + dep.getVersion() + "," + url + "," + licenseType + "\n");
156162
}
157163

158164
Files.writeString(outputFile.toPath(), output.toString(), StandardOpenOption.CREATE);
159165
}
160166

161167
@Input
162-
public LinkedHashMap<String, String> getMappings() {
163-
return mappings;
164-
}
165-
166-
public void setMappings(LinkedHashMap<String, String> mappings) {
167-
this.mappings = mappings;
168-
}
168+
@Optional
169+
public abstract MapProperty<String, String> getMappings();
169170

170171
/**
171172
* Create an URL on <a href="https://repo1.maven.org/maven2/">Maven Central</a>

0 commit comments

Comments
 (0)