diff --git a/changelog/@unreleased/pr-1338.v2.yml b/changelog/@unreleased/pr-1338.v2.yml new file mode 100644 index 000000000..09e90ba54 --- /dev/null +++ b/changelog/@unreleased/pr-1338.v2.yml @@ -0,0 +1,7 @@ +type: fix +fix: + description: Fix task dependencies onto other subprojects for `com.palantir.baseline-exact-dependencies` + tasks (`checkUnusedDependencies`, `checkImplicitDependencies`), so they work with + gradle 6.4. + links: + - https://github.com/palantir/gradle-baseline/pull/1338 diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java index 8c3c78513..432b0e0ed 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java @@ -48,11 +48,13 @@ import org.gradle.api.artifacts.component.ComponentIdentifier; import org.gradle.api.artifacts.component.ProjectComponentIdentifier; import org.gradle.api.attributes.Attribute; +import org.gradle.api.attributes.LibraryElements; import org.gradle.api.attributes.Usage; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.TaskProvider; import org.gradle.util.GUtil; +import org.gradle.util.GradleVersion; /** Validates that java projects declare exactly the dependencies they rely on, no more and no less. */ public final class BaselineExactDependencies implements Plugin { @@ -99,11 +101,20 @@ private static void configureSourceSet( compile.toString(), implementation.toString())); conf.setVisible(false); conf.setCanBeConsumed(false); - // Important! this ensures we resolve 'compile' variants rather than 'runtime' - // This is the same attribute that's being set on compileClasspath - conf.getAttributes() - .attribute( - Usage.USAGE_ATTRIBUTE, project.getObjects().named(Usage.class, Usage.JAVA_API)); + + conf.attributes(attributes -> { + // This ensures we resolve 'compile' variants rather than 'runtime' + // This is the same attribute that's being set on compileClasspath + attributes.attribute( + Usage.USAGE_ATTRIBUTE, project.getObjects().named(Usage.class, Usage.JAVA_API)); + // Ensure we resolve the classes directory for local projects where possible, rather than the + // 'jar' file. We can only do this on Gradle 5.6+, otherwise do nothing. + if (GradleVersion.current().compareTo(GradleVersion.version("5.6")) >= 0) { + attributes.attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + project.getObjects().named(LibraryElements.class, LibraryElements.CLASSES)); + } + }); // Without this, the 'checkUnusedDependencies correctly picks up project dependency on java-library' // test fails, by not causing gradle run the jar task, but resolving the path to the jar (rather diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckImplicitDependenciesTask.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckImplicitDependenciesTask.java index 43bb63f8c..9c3208160 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckImplicitDependenciesTask.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckImplicitDependenciesTask.java @@ -38,8 +38,8 @@ import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.TaskAction; public class CheckImplicitDependenciesTask extends DefaultTask { @@ -142,7 +142,7 @@ private boolean shouldIgnore(ResolvedArtifact artifact) { return ignore.get().contains(BaselineExactDependencies.asString(artifact)); } - @Input + @Classpath public final Provider> getDependenciesConfigurations() { return dependenciesConfigurations; } @@ -151,7 +151,7 @@ public final void dependenciesConfiguration(Configuration dependenciesConfigurat this.dependenciesConfigurations.add(Objects.requireNonNull(dependenciesConfiguration)); } - @InputFiles + @Classpath public final Provider getSourceClasses() { return sourceClasses; } diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckUnusedDependenciesTask.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckUnusedDependenciesTask.java index 46353d1e7..8c31420cb 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckUnusedDependenciesTask.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckUnusedDependenciesTask.java @@ -38,8 +38,8 @@ import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.TaskAction; public class CheckUnusedDependenciesTask extends DefaultTask { @@ -176,7 +176,7 @@ private boolean shouldIgnore(ResolvedArtifact artifact) { return ignore.get().contains(BaselineExactDependencies.asString(artifact)); } - @Input + @Classpath public final Provider> getDependenciesConfigurations() { return dependenciesConfigurations; } @@ -206,7 +206,7 @@ public final void sourceOnlyConfiguration(Configuration configuration) { this.sourceOnlyConfigurations.add(Objects.requireNonNull(configuration)); } - @InputFiles + @Classpath public final Provider getSourceClasses() { return sourceClasses; } diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy index 050d9d2a4..84bf1acc6 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy @@ -19,6 +19,7 @@ package com.palantir.baseline import java.nio.file.Files import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Unroll class BaselineExactDependenciesTest extends AbstractPluginTest { @@ -113,7 +114,8 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { result.task(':checkUnusedDependenciesMain').getOutcome() == TaskOutcome.SUCCESS } - def 'checkUnusedDependencies correctly picks up project dependency on java-library'() { + @Unroll + def '#task correctly picks up project dependency on java-library'() { when: buildFile << standardBuildFile buildFile << """ @@ -139,8 +141,11 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { """.stripIndent() then: - def result = with('checkUnusedDependencies', '--stacktrace').build() + def result = with(":${task}", '--stacktrace').build() assert result.task(':needs-building-first:compileJava').getOutcome() != null + + where: + task << ['checkUnusedDependencies', 'checkImplicitDependencies'] } def 'checkUnusedDependenciesTest passes if dependency from main source set is not referenced in test'() {