diff --git a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java index a3f7ef17..2f5ebe2c 100644 --- a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java +++ b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java @@ -61,7 +61,7 @@ public void apply(Project project) { // Do not apply the repositories automatically if they have been applied at the settings-level. // It's still possible to apply them manually, though. - if (!project.getGradle().getPlugins().hasPlugin(LegacyRepositoriesPlugin.class)) { + if (!project.getPlugins().hasPlugin(LegacyRepositoriesPlugin.DeclaredInSettingsPlugin.class)) { project.getPlugins().apply(LegacyRepositoriesPlugin.class); } else { LOG.info("Not enabling legacy repositories since they were applied at the settings level"); diff --git a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java index 20e5d2a7..0a0bb1bf 100644 --- a/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java +++ b/src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyRepositoriesPlugin.java @@ -22,7 +22,9 @@ public void apply(PluginAware target) { applyRepositories(project.getRepositories()); } else if (target instanceof Settings settings) { applyRepositories(settings.getDependencyResolutionManagement().getRepositories()); - settings.getGradle().getPlugins().apply(getClass()); // Add a marker to Gradle + + // Apply our marker plugin to all projects. + settings.getGradle().beforeProject(project -> project.getPluginManager().apply(DeclaredInSettingsPlugin.class)); } else if (target instanceof Gradle gradle) { // Do nothing } else { @@ -30,6 +32,14 @@ public void apply(PluginAware target) { } } + /** + * A marker plugin applied to each project, indicating this plugin was applied on the settings level. + */ + public static final class DeclaredInSettingsPlugin implements Plugin { + @Override + public void apply(Project target) {} + } + private void applyRepositories(RepositoryHandler repositories) { repositories.maven(repo -> { repo.setName("MinecraftForge"); diff --git a/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java b/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java index 97f0e7f5..edd22264 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java @@ -30,7 +30,7 @@ public void apply(Project project) { // Do not apply the repositories automatically if they have been applied at the settings-level. // It's still possible to apply them manually, though. - if (!project.getGradle().getPlugins().hasPlugin(RepositoriesPlugin.class)) { + if (!project.getPlugins().hasPlugin(RepositoriesPlugin.DeclaredInSettingsPlugin.class)) { project.getPlugins().apply(RepositoriesPlugin.class); } else { LOG.info("Not enabling NeoForged repositories since they were applied at the settings level"); diff --git a/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java b/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java index ec296a1a..47f82f4b 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/RepositoriesPlugin.java @@ -26,7 +26,9 @@ public void apply(PluginAware target) { applyRepositories(project.getRepositories()); } else if (target instanceof Settings settings) { applyRepositories(settings.getDependencyResolutionManagement().getRepositories()); - settings.getGradle().getPlugins().apply(getClass()); // Add a marker to Gradle + + // Apply our marker plugin to all projects. + settings.getGradle().beforeProject(project -> project.getPluginManager().apply(DeclaredInSettingsPlugin.class)); } else if (target instanceof Gradle gradle) { // Do nothing } else { @@ -34,6 +36,14 @@ public void apply(PluginAware target) { } } + /** + * A marker plugin applied to each project, indicating this plugin was applied on the settings level. + */ + public static final class DeclaredInSettingsPlugin implements Plugin { + @Override + public void apply(Project target) {} + } + private void applyRepositories(RepositoryHandler repositories) { var mojangMaven = repositories.maven(repo -> { repo.setName("Mojang Minecraft Libraries"); diff --git a/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java b/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java index 7ab4201f..02992c47 100644 --- a/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java +++ b/src/test/java/net/neoforged/moddevgradle/functional/GroovyScriptTest.java @@ -51,4 +51,34 @@ public void testApplyInEmptyProjectAndEnable() throws IOException { assertThat(result.getOutput()).contains("createMinecraftArtifacts"); assertEquals(TaskOutcome.SUCCESS, result.task(":tasks").getOutcome()); } + + @Test + public void testApplyInSettings() throws IOException { + writeFile(settingsFile, """ + plugins { + id "net.neoforged.moddev.repositories" + } + + rootProject.name = 'hello-world' + + dependencyResolutionManagement { + repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS + } + """); + String buildFileContent = """ + plugins { + id "net.neoforged.moddev" + } + """; + writeFile(buildFile, buildFileContent); + + BuildResult result = GradleRunner.create() + .withPluginClasspath() + .withProjectDir(testProjectDir) + .withArguments("tasks", "--all", "-i") + .build(); + + assertThat(result.getOutput()).contains("Not enabling NeoForged repositories since they were applied at the settings level"); + assertEquals(TaskOutcome.SUCCESS, result.task(":tasks").getOutcome()); + } }