diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index 0a84bdf..938def6 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -31,6 +31,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.plugins.PluginAware; import net.fabricmc.loom.configuration.CompileConfiguration; import net.fabricmc.loom.configuration.FabricApiExtension; @@ -40,12 +41,20 @@ import net.fabricmc.loom.configuration.providers.mappings.MappingsCache; import net.fabricmc.loom.decompilers.DecompilerConfiguration; import net.fabricmc.loom.task.LoomTasks; -public class LoomGradlePlugin implements Plugin { +public class LoomGradlePlugin implements Plugin { public static boolean refreshDeps; public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); @Override + public void apply(PluginAware target) { + target.getPlugins().apply(LoomRepositoryPlugin.class); + + if (target instanceof Project project) { + apply(project); + } + } + public void apply(Project project) { project.getLogger().lifecycle("Fabric Loom: " + LoomGradlePlugin.class.getPackage().getImplementationVersion()); diff --git a/src/main/java/net/fabricmc/loom/LoomRepositoryPlugin.java b/src/main/java/net/fabricmc/loom/LoomRepositoryPlugin.java new file mode 100644 index 0000000..5d77c0d --- /dev/null +++ b/src/main/java/net/fabricmc/loom/LoomRepositoryPlugin.java @@ -0,0 +1,200 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom; + +import java.io.File; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.artifacts.dsl.RepositoryHandler; +import org.gradle.api.artifacts.repositories.IvyArtifactRepository; +import org.gradle.api.initialization.Settings; +import org.gradle.api.invocation.Gradle; +import org.gradle.api.plugins.PluginAware; + +public class LoomRepositoryPlugin implements Plugin { + @Override + public void apply(PluginAware target) { + RepositoryHandler repositories = null; + + if (target instanceof Settings settings) { + repositories = settings.getDependencyResolutionManagement().getRepositories(); + + // leave a marker so projects don't try to override these + settings.getGradle().getPluginManager().apply(LoomRepositoryPlugin.class); + } else if (target instanceof Project project) { + if (project.getGradle().getPlugins().hasPlugin(LoomRepositoryPlugin.class)) { + return; + } + + repositories = project.getRepositories(); + } else if (target instanceof Gradle) { + return; + } else { + throw new IllegalArgumentException("Expected target to be a Project or Settings, but was a " + target.getClass()); + } + + Cache cache = new Cache(target); + + // MavenConfiguration.java + repositories.flatDir(repo -> { + repo.setName("UserLocalCacheFiles"); + repo.dir(cache.getRootBuildCache()); + }); + repositories.maven(repo -> { + repo.setName("UserLocalRemappedMods"); + repo.setUrl(cache.getRemappedModCache()); + }); + repositories.maven(repo -> { + repo.setName("Fabric"); + repo.setUrl("https://maven.fabricmc.net/"); + }); + repositories.maven(repo -> { + repo.setName("Mojang"); + repo.setUrl("https://libraries.minecraft.net/"); + }); + repositories.mavenCentral(); + + // MinecraftMappedProvider.java + repositories.ivy(repo -> { + repo.setUrl(cache.getUserCache()); + repo.patternLayout(layout -> { + layout.artifact("[revision]/[artifact]-[revision](.[ext])"); + }); + repo.metadataSources(IvyArtifactRepository.MetadataSources::artifact); + }); + + // MinecraftProcessedProvider.java + repositories.ivy(repo -> { + repo.setUrl(cache.getRootPersistentCache()); + repo.patternLayout(layout -> { + layout.artifact("[revision]/[artifact]-[revision](.[ext])"); + }); + repo.metadataSources(IvyArtifactRepository.MetadataSources::artifact); + }); + } +} + +final class Cache { + private PluginAware target; + + Cache(PluginAware target) { + if (target instanceof Project || target instanceof Settings) { + this.target = target; + } else { + throw new IllegalArgumentException("Expected target to be a Project or Settings, but was a " + target.getClass()); + } + } + + File getUserCache() { + File gradleUserHomeDir = null; + + if (target instanceof Settings settings) { + gradleUserHomeDir = settings.getGradle().getGradleUserHomeDir(); + } else if (target instanceof Project project) { + gradleUserHomeDir = project.getGradle().getGradleUserHomeDir(); + } else { + throw new IllegalArgumentException("Expected target to be a Project or Settings, but was a " + target.getClass()); + } + + File userCache = new File(gradleUserHomeDir, "caches" + File.separator + "fabric-loom"); + + if (!userCache.exists()) { + userCache.mkdirs(); + } + + return userCache; + } + + public File getRootPersistentCache() { + File rootDir = null; + + if (target instanceof Settings settings) { + rootDir = settings.getRootDir(); + } else if (target instanceof Project project) { + rootDir = project.getRootDir(); + } else { + throw new IllegalArgumentException("Expected target to be a Project or Settings, but was a " + target.getClass()); + } + + File persistentCache = new File(rootDir, ".gradle" + File.separator + "loom-cache"); + + if (!persistentCache.exists()) { + persistentCache.mkdirs(); + } + + return persistentCache; + } + + public File getRootBuildCache() { + File rootDir = null; + + if (target instanceof Settings settings) { + rootDir = settings.getRootDir(); + } else if (target instanceof Project project) { + rootDir = project.getRootDir(); + } else { + throw new IllegalArgumentException("Expected target to be a Project or Settings, but was a " + target.getClass()); + } + + File buildCache = new File(rootDir, "build" + File.separator + "loom-cache"); + + if (!buildCache.exists()) { + buildCache.mkdirs(); + } + + return buildCache; + } + + public File getRemappedModCache() { + File remappedModCache = new File(getRootPersistentCache(), "remapped_mods"); + + if (!remappedModCache.exists()) { + remappedModCache.mkdir(); + } + + return remappedModCache; + } + + public File getNestedModCache() { + File nestedModCache = new File(getRootPersistentCache(), "nested_mods"); + + if (!nestedModCache.exists()) { + nestedModCache.mkdir(); + } + + return nestedModCache; + } + + public File getNativesJarStore() { + File natives = new File(getUserCache(), "natives/jars"); + + if (!natives.exists()) { + natives.mkdirs(); + } + + return natives; + } +} diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 343353a..8e75df8 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -107,8 +107,6 @@ public final class CompileConfiguration { p.afterEvaluate(project -> { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - MavenConfiguration.setup(project); - LoomDependencyManager dependencyManager = new LoomDependencyManager(); extension.setDependencyManager(dependencyManager); diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java index 397908c..55c544c 100644 --- a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java @@ -45,6 +45,7 @@ import net.fabricmc.loom.configuration.mods.ModProcessor; import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.SourceRemapper; +import net.fabricmc.loom.LoomRepositoryPlugin; public class LoomDependencyManager { private static class ProviderList { @@ -193,7 +194,9 @@ public class LoomDependencyManager { project.getLogger().debug("Loom adding " + name + " from installer JSON"); - if (jsonElement.getAsJsonObject().has("url")) { + // If user choose to use dependencyResolutionManagement, then they should declare + // these repositories manually in the settings file. + if (jsonElement.getAsJsonObject().has("url") && !project.getGradle().getPlugins().hasPlugin(LoomRepositoryPlugin.class)) { String url = jsonElement.getAsJsonObject().get("url").getAsString(); long count = project.getRepositories().stream().filter(artifactRepository -> artifactRepository instanceof MavenArtifactRepository) .map(artifactRepository -> (MavenArtifactRepository) artifactRepository) diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java b/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java index adf85fd..0a24a75 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftProcessedProvider.java @@ -37,7 +37,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvid import net.fabricmc.loom.util.Constants; public class MinecraftProcessedProvider extends MinecraftMappedProvider { - public static final String PROJECT_MAPPED_CLASSIFIER = "projectmapped"; + public final String projectMappedClassifier; private File projectMappedJar; @@ -46,6 +46,8 @@ public class MinecraftProcessedProvider extends MinecraftMappedProvider { public MinecraftProcessedProvider(Project project, JarProcessorManager jarProcessorManager) { super(project); this.jarProcessorManager = jarProcessorManager; + this.projectMappedClassifier = "project-" + project.getPath().replace(':', '@') + + "-mapped"; } @Override @@ -63,14 +65,12 @@ public class MinecraftProcessedProvider extends MinecraftMappedProvider { jarProcessorManager.process(projectMappedJar); } - getProject().getRepositories().flatDir(repository -> repository.dir(getJarDirectory(getExtension().getProjectPersistentCache(), PROJECT_MAPPED_CLASSIFIER))); - getProject().getDependencies().add(Constants.Configurations.MINECRAFT_NAMED, - getProject().getDependencies().module("net.minecraft:minecraft:" + getJarVersionString(PROJECT_MAPPED_CLASSIFIER))); + getProject().getDependencies().module("net.minecraft:minecraft:" + getJarVersionString(projectMappedClassifier))); } private void invalidateJars() { - File dir = getJarDirectory(getExtension().getUserCache(), PROJECT_MAPPED_CLASSIFIER); + File dir = getJarDirectory(getExtension().getUserCache(), projectMappedClassifier); if (dir.exists()) { getProject().getLogger().warn("Invalidating project jars"); @@ -87,7 +87,7 @@ public class MinecraftProcessedProvider extends MinecraftMappedProvider { public void initFiles(MinecraftProvider minecraftProvider, MappingsProvider mappingsProvider) { super.initFiles(minecraftProvider, mappingsProvider); - projectMappedJar = new File(getJarDirectory(getExtension().getProjectPersistentCache(), PROJECT_MAPPED_CLASSIFIER), "minecraft-" + getJarVersionString(PROJECT_MAPPED_CLASSIFIER) + ".jar"); + projectMappedJar = new File(getJarDirectory(getExtension().getRootProjectPersistentCache(), projectMappedClassifier), "minecraft-" + getJarVersionString(projectMappedClassifier) + ".jar"); } @Override diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java index 0032a17..a271809 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java @@ -144,8 +144,6 @@ public class MinecraftMappedProvider extends DependencyProvider { } protected void addDependencies(DependencyInfo dependency, Consumer postPopulationScheduler) { - getProject().getRepositories().flatDir(repository -> repository.dir(getJarDirectory(getExtension().getUserCache(), "mapped"))); - getProject().getDependencies().add(Constants.Configurations.MINECRAFT_NAMED, getProject().getDependencies().module("net.minecraft:minecraft:" + getJarVersionString("mapped"))); } diff --git a/src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java b/src/test/groovy/net/fabricmc/loom/test/integration/dependencyResolutionManagement.groovy similarity index 57% rename from src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java rename to src/test/groovy/net/fabricmc/loom/test/integration/dependencyResolutionManagement.groovy index 2fb2ae7..a8b2733 100644 --- a/src/main/java/net/fabricmc/loom/configuration/MavenConfiguration.java +++ b/src/test/groovy/net/fabricmc/loom/test/integration/dependencyResolutionManagement.groovy @@ -22,36 +22,31 @@ * SOFTWARE. */ -package net.fabricmc.loom.configuration; +package net.fabricmc.loom.test.integration -import org.gradle.api.Project; +import net.fabricmc.loom.test.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll -import net.fabricmc.loom.LoomGradleExtension; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS -public class MavenConfiguration { - public static void setup(Project project) { - LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); +class DependencyResolutionManagementTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "dependencyResolutionManagement" + } - project.getRepositories().flatDir(repo -> { - repo.setName("UserLocalCacheFiles"); - repo.dir(extension.getRootProjectBuildCache()); - }); + @Unroll + def "build (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":basic:build").outcome == SUCCESS + result.task(":projmap:build").outcome == SUCCESS - project.getRepositories().maven(repo -> { - repo.setName("UserLocalRemappedMods"); - repo.setUrl(extension.getRemappedModCache()); - }); - - project.getRepositories().maven(repo -> { - repo.setName("Fabric"); - repo.setUrl("https://maven.fabricmc.net/"); - }); - - project.getRepositories().maven(repo -> { - repo.setName("Mojang"); - repo.setUrl("https://libraries.minecraft.net/"); - }); - - project.getRepositories().mavenCentral(); - } + where: + gradle | _ + DEFAULT_GRADLE | _ + PRE_RELEASE_GRADLE | _ + } } diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/build.gradle b/src/test/resources/projects/dependencyResolutionManagement/basic/build.gradle new file mode 100644 index 0000000..f02447c --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/basic/build.gradle @@ -0,0 +1,92 @@ +plugins { + id 'fabric-loom' + id 'maven-publish' +} + +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +archivesBaseName = project.archives_base_name +version = project.mod_version +group = project.maven_group + +repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. + // You may need to force-disable transitiveness on them. +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + // ensure that the encoding is set to UTF-8, no matter what the system default is + // this fixes some edge cases with special characters not displaying correctly + // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html + // If Javadoc is generated, this must be specified in that task too. + it.options.encoding = "UTF-8" + + // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too + // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used. + // We'll use that if it's available, but otherwise we'll use the older option. + def targetVersion = 8 + if (JavaVersion.current().isJava9Compatible()) { + it.options.release = targetVersion + } +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() +} + +jar { + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}"} + } +} + +// configure the maven publication +publishing { + publications { + mavenJava(MavenPublication) { + // add all the jars that should be included when publishing to maven + artifact(remapJar) { + builtBy remapJar + } + artifact(sourcesJar) { + builtBy remapSourcesJar + } + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/gradle.properties b/src/test/resources/projects/dependencyResolutionManagement/basic/gradle.properties new file mode 100644 index 0000000..40e9e57 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/basic/gradle.properties @@ -0,0 +1,17 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G + +# Fabric Properties + # check these on https://fabricmc.net/use + minecraft_version=1.16.5 + yarn_mappings=1.16.5+build.6 + loader_version=0.11.3 + +# Mod Properties + mod_version = 1.0.0 + maven_group = com.example + archives_base_name = fabric-example-mod + +# Dependencies + # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api + fabric_version=0.32.5+1.16 diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/java/net/fabricmc/example/ExampleMod.java new file mode 100644 index 0000000..e5ed082 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/java/net/fabricmc/example/ExampleMod.java @@ -0,0 +1,14 @@ +package net.fabricmc.example; + +import net.fabricmc.api.ModInitializer; + +public class ExampleMod implements ModInitializer { + @Override + public void onInitialize() { + // This code runs as soon as Minecraft is in a mod-load-ready state. + // However, some things (like resources) may still be uninitialized. + // Proceed with mild caution. + + System.out.println("Hello Fabric world!"); + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java new file mode 100644 index 0000000..83ee1a8 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java @@ -0,0 +1,15 @@ +package net.fabricmc.example.mixin; + +import net.minecraft.client.gui.screen.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TitleScreen.class) +public class ExampleMixin { + @Inject(at = @At("HEAD"), method = "init()V") + private void init(CallbackInfo info) { + System.out.println("This line is printed by an example mod mixin!"); + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/assets/modid/icon.png b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/assets/modid/icon.png new file mode 100644 index 0000000..047b91f Binary files /dev/null and b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/assets/modid/icon.png differ diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/fabric.mod.json b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..df92d8b --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/fabric.mod.json @@ -0,0 +1,37 @@ +{ + "schemaVersion": 1, + "id": "modid", + "version": "${version}", + + "name": "Example Mod", + "description": "This is an example description! Tell everyone what your mod is about!", + "authors": [ + "Me!" + ], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + + "license": "CC0-1.0", + "icon": "assets/modid/icon.png", + + "environment": "*", + "entrypoints": { + "main": [ + "net.fabricmc.example.ExampleMod" + ] + }, + "mixins": [ + "modid.mixins.json" + ], + + "depends": { + "fabricloader": ">=0.7.4", + "fabric": "*", + "minecraft": "1.16.x" + }, + "suggests": { + "another-mod": "*" + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/modid.mixins.json b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/modid.mixins.json new file mode 100644 index 0000000..21fe73a --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/basic/src/main/resources/modid.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.fabricmc.example.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "ExampleMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/build.gradle b/src/test/resources/projects/dependencyResolutionManagement/projmap/build.gradle new file mode 100644 index 0000000..ca8c73f --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/build.gradle @@ -0,0 +1,96 @@ +plugins { + id 'fabric-loom' + id 'maven-publish' +} + +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +archivesBaseName = project.archives_base_name +version = project.mod_version +group = project.maven_group + +repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. + // You may need to force-disable transitiveness on them. +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + // ensure that the encoding is set to UTF-8, no matter what the system default is + // this fixes some edge cases with special characters not displaying correctly + // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html + // If Javadoc is generated, this must be specified in that task too. + it.options.encoding = "UTF-8" + + // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too + // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used. + // We'll use that if it's available, but otherwise we'll use the older option. + def targetVersion = 8 + if (JavaVersion.current().isJava9Compatible()) { + it.options.release = targetVersion + } +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() +} + +jar { + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}"} + } +} + +minecraft { + accessWidener = file("src/main/resources/modid.accesswidener") +} + +// configure the maven publication +publishing { + publications { + mavenJava(MavenPublication) { + // add all the jars that should be included when publishing to maven + artifact(remapJar) { + builtBy remapJar + } + artifact(sourcesJar) { + builtBy remapSourcesJar + } + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/gradle.properties b/src/test/resources/projects/dependencyResolutionManagement/projmap/gradle.properties new file mode 100644 index 0000000..40e9e57 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/gradle.properties @@ -0,0 +1,17 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G + +# Fabric Properties + # check these on https://fabricmc.net/use + minecraft_version=1.16.5 + yarn_mappings=1.16.5+build.6 + loader_version=0.11.3 + +# Mod Properties + mod_version = 1.0.0 + maven_group = com.example + archives_base_name = fabric-example-mod + +# Dependencies + # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api + fabric_version=0.32.5+1.16 diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/java/net/fabricmc/example/ExampleMod.java new file mode 100644 index 0000000..e5ed082 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/java/net/fabricmc/example/ExampleMod.java @@ -0,0 +1,14 @@ +package net.fabricmc.example; + +import net.fabricmc.api.ModInitializer; + +public class ExampleMod implements ModInitializer { + @Override + public void onInitialize() { + // This code runs as soon as Minecraft is in a mod-load-ready state. + // However, some things (like resources) may still be uninitialized. + // Proceed with mild caution. + + System.out.println("Hello Fabric world!"); + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java new file mode 100644 index 0000000..83ee1a8 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/java/net/fabricmc/example/mixin/ExampleMixin.java @@ -0,0 +1,15 @@ +package net.fabricmc.example.mixin; + +import net.minecraft.client.gui.screen.TitleScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TitleScreen.class) +public class ExampleMixin { + @Inject(at = @At("HEAD"), method = "init()V") + private void init(CallbackInfo info) { + System.out.println("This line is printed by an example mod mixin!"); + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/assets/modid/icon.png b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/assets/modid/icon.png new file mode 100644 index 0000000..047b91f Binary files /dev/null and b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/assets/modid/icon.png differ diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/fabric.mod.json b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..4764df8 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/fabric.mod.json @@ -0,0 +1,38 @@ +{ + "schemaVersion": 1, + "id": "modid", + "version": "${version}", + + "name": "Example Mod", + "description": "This is an example description! Tell everyone what your mod is about!", + "authors": [ + "Me!" + ], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + + "license": "CC0-1.0", + "icon": "assets/modid/icon.png", + + "environment": "*", + "entrypoints": { + "main": [ + "net.fabricmc.example.ExampleMod" + ] + }, + "mixins": [ + "modid.mixins.json" + ], + + "depends": { + "fabricloader": ">=0.7.4", + "fabric": "*", + "minecraft": "1.16.x" + }, + "suggests": { + "another-mod": "*" + }, + "accessWidener" : "modid.accesswidener" +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.accesswidener b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.accesswidener new file mode 100644 index 0000000..9684ec8 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.accesswidener @@ -0,0 +1,2 @@ +accessWidener v1 named +extendable class net/minecraft/fluid/FluidState diff --git a/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.mixins.json b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.mixins.json new file mode 100644 index 0000000..21fe73a --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.fabricmc.example.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + "ExampleMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/test/resources/projects/dependencyResolutionManagement/settings.gradle b/src/test/resources/projects/dependencyResolutionManagement/settings.gradle new file mode 100644 index 0000000..c05e369 --- /dev/null +++ b/src/test/resources/projects/dependencyResolutionManagement/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + plugins { + id 'fabric-loom' + } +} + +plugins { + id 'fabric-loom' +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) +} + +include 'basic' +include 'projmap' \ No newline at end of file