Skip to content

Commit d809431

Browse files
committed
Automatically remove local Gradle dependencies
Only if they are automatically detected in configurations. Helps streamline plugin development. Also, fix instances where applying GradleUtils on non-Java projects could fail project import.
1 parent 9780933 commit d809431

File tree

1 file changed

+97
-15
lines changed

1 file changed

+97
-15
lines changed

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionImpl.groovy

Lines changed: 97 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import groovy.transform.PackageScope
1111
import org.codehaus.groovy.runtime.DefaultGroovyMethods
1212
import org.gradle.api.Action
1313
import org.gradle.api.Project
14+
import org.gradle.api.artifacts.Configuration
1415
import org.gradle.api.artifacts.ConfigurationContainer
16+
import org.gradle.api.artifacts.DependencySet
1517
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
1618
import org.gradle.api.attributes.plugin.GradlePluginApiVersion
1719
import org.gradle.api.file.Directory
@@ -24,13 +26,15 @@ import org.gradle.api.model.ObjectFactory
2426
import org.gradle.api.plugins.BasePluginExtension
2527
import org.gradle.api.plugins.ExtensionAware
2628
import org.gradle.api.plugins.JavaPlugin
29+
import org.gradle.api.plugins.JavaPluginExtension
2730
import org.gradle.api.provider.Property
2831
import org.gradle.api.provider.Provider
2932
import org.gradle.api.provider.ProviderFactory
3033
import org.gradle.api.publish.PublishingExtension
3134
import org.gradle.api.publish.maven.MavenPublication
3235
import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
3336
import org.gradle.api.specs.Spec
37+
import org.gradle.api.tasks.SourceSetContainer
3438
import org.gradle.api.tasks.TaskProvider
3539
import org.gradle.api.tasks.compile.GroovyCompile
3640
import org.gradle.api.tasks.compile.JavaCompile
@@ -155,10 +159,20 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
155159
super(project)
156160
this.project = project
157161

158-
project.tasks.register(GenerateActionsWorkflow.NAME, GenerateActionsWorkflowImpl)
162+
this.setup(project)
163+
project.afterEvaluate { this.finish(it) }
164+
}
159165

166+
private void setup(Project project) {
167+
project.tasks.register(GenerateActionsWorkflow.NAME, GenerateActionsWorkflowImpl)
160168

161-
project.afterEvaluate { this.finish(it) }
169+
project.pluginManager.withPlugin('publishing') {
170+
if (this.problems.test('net.minecraftforge.gradleutils.publishing.use-base-archives-name')) {
171+
project.extensions.getByType(PublishingExtension).publications.withType(MavenPublication).configureEach {
172+
it.artifactId = project.extensions.getByType(BasePluginExtension).archivesName
173+
}
174+
}
175+
}
162176
}
163177

164178
private void finish(Project project) {
@@ -206,7 +220,7 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
206220
file.bytes = textOutput
207221

208222
task.logger.lifecycle("Generated report file ${projectLayout.projectDirectory.asFile.toPath().relativize(file.toPath())}")
209-
break;
223+
break
210224
}
211225
}
212226
}
@@ -215,19 +229,87 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
215229
}
216230
}
217231

218-
// Removes local Gradle API from compileOnly. This is a workaround for bugged plugins.
219-
// Publish Plugin: https://github.com/gradle/plugin-portal-requests/issues/260
220-
// Shadow: https://github.com/GradleUp/shadow/pull/1422
221-
if (this.providers.systemProperty('org.gradle.unsafe.suppress-gradle-api').map(Boolean.&parseBoolean).getOrElse(false)) {
222-
final gradleApi = project.dependencies.gradleApi()
223-
project.configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME.&equals as Spec<String>).configureEach { compileOnly ->
224-
compileOnly.withDependencies { it.remove(gradleApi) }
225-
}
226-
}
232+
project.pluginManager.withPlugin('java') {
233+
// Removes local Gradle API dependencies if we are using external alternatives
234+
// Gradle's core plugins often force these when using 'java-gradle-plugin' or others
235+
project.extensions.getByType(JavaPluginExtension).sourceSets { SourceSetContainer sourceSets ->
236+
final gradleApi = project.dependencies.gradleApi()
237+
final gradleTestKit = project.dependencies.gradleTestKit()
238+
final localGroovy = project.dependencies.localGroovy()
239+
240+
def hasExternalGradleApi = { @Nullable Configuration... configurations ->
241+
for (var configuration in configurations) {
242+
if (configuration?.allDependencies?.find {
243+
(it.group == 'dev.gradleplugins' || it.group == 'name.remal.gradle-api')
244+
&& it.name == 'gradle-api'
245+
} !== null) { return true }
246+
}
247+
248+
return false
249+
}
250+
251+
def hasExternalGradleTestKit = { @Nullable Configuration... configurations ->
252+
for (var configuration in configurations) {
253+
if (configuration?.allDependencies?.find {
254+
(it.group == 'dev.gradleplugins' || it.group == 'name.remal.gradle-api')
255+
&& it.name == 'gradle-test-kit'
256+
} !== null) { return true }
257+
}
258+
259+
return false
260+
}
261+
262+
def hasExternalLocalGroovy = { @Nullable Configuration... configurations ->
263+
for (var configuration in configurations) {
264+
if (configuration?.allDependencies?.find {
265+
it.group == 'name.remal.gradle-api'
266+
&& it.name == 'local-groovy'
267+
} !== null) { return true }
268+
}
227269

228-
if (this.problems.test('net.minecraftforge.gradleutils.publishing.use-base-archives-name')) {
229-
project.extensions.getByType(PublishingExtension).publications.withType(MavenPublication).configureEach {
230-
it.artifactId = project.extensions.getByType(BasePluginExtension).archivesName
270+
return false
271+
}
272+
273+
def processConfigurations = { @Nullable Configuration... configurations ->
274+
if (hasExternalGradleApi(configurations)) {
275+
for (var configuration in configurations) {
276+
configuration?.withDependencies { dependencies ->
277+
dependencies.remove(gradleApi)
278+
dependencies.remove(localGroovy)
279+
}
280+
}
281+
}
282+
283+
if (hasExternalGradleTestKit(configurations)) {
284+
for (var configuration in configurations) {
285+
configuration?.withDependencies { dependencies ->
286+
dependencies.remove(gradleTestKit)
287+
dependencies.remove(gradleApi)
288+
dependencies.remove(localGroovy)
289+
}
290+
}
291+
}
292+
293+
if (hasExternalLocalGroovy(configurations)) {
294+
for (var configuration in configurations) {
295+
configuration?.withDependencies { dependencies ->
296+
dependencies.remove(localGroovy)
297+
}
298+
}
299+
}
300+
301+
}
302+
303+
for (var sourceSet in sourceSets) {
304+
@Nullable var api = project.configurations.findByName(sourceSet.apiConfigurationName)
305+
@Nullable var compileOnlyApi = project.configurations.findByName(sourceSet.compileOnlyApiConfigurationName)
306+
@Nullable var implementation = project.configurations.findByName(sourceSet.implementationConfigurationName)
307+
@Nullable var compileOnly = project.configurations.findByName(sourceSet.compileOnlyConfigurationName)
308+
@Nullable var runtimeOnly = project.configurations.findByName(sourceSet.runtimeOnlyConfigurationName)
309+
310+
processConfigurations(api, implementation, runtimeOnly)
311+
processConfigurations(api, compileOnlyApi, implementation, compileOnly)
312+
}
231313
}
232314
}
233315

0 commit comments

Comments
 (0)