add support for new dependencyResolutionManagement (#400)
* move repo declartions - Move repository declartions in MavenConfiguration.java to LoomRepositoryPlugin.java * move repo declartions - Move repository declartions in MinecraftMappedProvider.java to LoomRepositoryPlugin.java * move repo declartions - Move repository declarations in MinecraftProcessedProvider.java to LoomRepositoryPlugin.java * do not add repositories if dependencyResolutionManagement is used * Simplify the change on LoomGradlePlugin - this is the suggestion from liach * change name to follow fabric naming convension - change getProjectUUID to getProjectUuid - change PROJECT_MAPPED_CLASSIFIER to projectMappedClassifier * remove MavenConfiguration.java - the file currently do nothing. * clean-up for all `instanceof` clause * add DependencyResolutionManagementTest * code cleanup * Update src/test/resources/projects/dependencyResolutionManagement/projmap/src/main/resources/modid.accesswidener * change project uuid to project full name Co-authored-by: modmuss50 <modmuss50@gmail.com>
This commit is contained in:
		
							parent
							
								
									de665ab498
								
							
						
					
					
						commit
						e955ebb8c5
					
				
					 23 changed files with 643 additions and 39 deletions
				
			
		|  | @ -31,6 +31,7 @@ import com.google.gson.Gson; | ||||||
| import com.google.gson.GsonBuilder; | import com.google.gson.GsonBuilder; | ||||||
| import org.gradle.api.Plugin; | import org.gradle.api.Plugin; | ||||||
| import org.gradle.api.Project; | import org.gradle.api.Project; | ||||||
|  | import org.gradle.api.plugins.PluginAware; | ||||||
| 
 | 
 | ||||||
| import net.fabricmc.loom.configuration.CompileConfiguration; | import net.fabricmc.loom.configuration.CompileConfiguration; | ||||||
| import net.fabricmc.loom.configuration.FabricApiExtension; | 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.decompilers.DecompilerConfiguration; | ||||||
| import net.fabricmc.loom.task.LoomTasks; | import net.fabricmc.loom.task.LoomTasks; | ||||||
| 
 | 
 | ||||||
| public class LoomGradlePlugin implements Plugin<Project> { | public class LoomGradlePlugin implements Plugin<PluginAware> { | ||||||
| 	public static boolean refreshDeps; | 	public static boolean refreshDeps; | ||||||
| 	public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); | 	public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); | ||||||
| 	public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); | 	public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  | 	public void apply(PluginAware target) { | ||||||
|  | 		target.getPlugins().apply(LoomRepositoryPlugin.class); | ||||||
|  | 
 | ||||||
|  | 		if (target instanceof Project project) { | ||||||
|  | 			apply(project); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	public void apply(Project project) { | 	public void apply(Project project) { | ||||||
| 		project.getLogger().lifecycle("Fabric Loom: " + LoomGradlePlugin.class.getPackage().getImplementationVersion()); | 		project.getLogger().lifecycle("Fabric Loom: " + LoomGradlePlugin.class.getPackage().getImplementationVersion()); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										200
									
								
								src/main/java/net/fabricmc/loom/LoomRepositoryPlugin.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								src/main/java/net/fabricmc/loom/LoomRepositoryPlugin.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -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<PluginAware> { | ||||||
|  | 	@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; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -107,8 +107,6 @@ public final class CompileConfiguration { | ||||||
| 		p.afterEvaluate(project -> { | 		p.afterEvaluate(project -> { | ||||||
| 			LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | 			LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||||
| 
 | 
 | ||||||
| 			MavenConfiguration.setup(project); |  | ||||||
| 
 |  | ||||||
| 			LoomDependencyManager dependencyManager = new LoomDependencyManager(); | 			LoomDependencyManager dependencyManager = new LoomDependencyManager(); | ||||||
| 			extension.setDependencyManager(dependencyManager); | 			extension.setDependencyManager(dependencyManager); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,6 +45,7 @@ import net.fabricmc.loom.configuration.mods.ModProcessor; | ||||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; | import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; | ||||||
| import net.fabricmc.loom.util.Constants; | import net.fabricmc.loom.util.Constants; | ||||||
| import net.fabricmc.loom.util.SourceRemapper; | import net.fabricmc.loom.util.SourceRemapper; | ||||||
|  | import net.fabricmc.loom.LoomRepositoryPlugin; | ||||||
| 
 | 
 | ||||||
| public class LoomDependencyManager { | public class LoomDependencyManager { | ||||||
| 	private static class ProviderList { | 	private static class ProviderList { | ||||||
|  | @ -193,7 +194,9 @@ public class LoomDependencyManager { | ||||||
| 
 | 
 | ||||||
| 			project.getLogger().debug("Loom adding " + name + " from installer JSON"); | 			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(); | 				String url = jsonElement.getAsJsonObject().get("url").getAsString(); | ||||||
| 				long count = project.getRepositories().stream().filter(artifactRepository -> artifactRepository instanceof MavenArtifactRepository) | 				long count = project.getRepositories().stream().filter(artifactRepository -> artifactRepository instanceof MavenArtifactRepository) | ||||||
| 						.map(artifactRepository -> (MavenArtifactRepository) artifactRepository) | 						.map(artifactRepository -> (MavenArtifactRepository) artifactRepository) | ||||||
|  |  | ||||||
|  | @ -37,7 +37,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvid | ||||||
| import net.fabricmc.loom.util.Constants; | import net.fabricmc.loom.util.Constants; | ||||||
| 
 | 
 | ||||||
| public class MinecraftProcessedProvider extends MinecraftMappedProvider { | public class MinecraftProcessedProvider extends MinecraftMappedProvider { | ||||||
| 	public static final String PROJECT_MAPPED_CLASSIFIER = "projectmapped"; | 	public final String projectMappedClassifier; | ||||||
| 
 | 
 | ||||||
| 	private File projectMappedJar; | 	private File projectMappedJar; | ||||||
| 
 | 
 | ||||||
|  | @ -46,6 +46,8 @@ public class MinecraftProcessedProvider extends MinecraftMappedProvider { | ||||||
| 	public MinecraftProcessedProvider(Project project, JarProcessorManager jarProcessorManager) { | 	public MinecraftProcessedProvider(Project project, JarProcessorManager jarProcessorManager) { | ||||||
| 		super(project); | 		super(project); | ||||||
| 		this.jarProcessorManager = jarProcessorManager; | 		this.jarProcessorManager = jarProcessorManager; | ||||||
|  | 		this.projectMappedClassifier = "project-" + project.getPath().replace(':', '@') | ||||||
|  | 				+ "-mapped"; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  | @ -63,14 +65,12 @@ public class MinecraftProcessedProvider extends MinecraftMappedProvider { | ||||||
| 			jarProcessorManager.process(projectMappedJar); | 			jarProcessorManager.process(projectMappedJar); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		getProject().getRepositories().flatDir(repository -> repository.dir(getJarDirectory(getExtension().getProjectPersistentCache(), PROJECT_MAPPED_CLASSIFIER))); |  | ||||||
| 
 |  | ||||||
| 		getProject().getDependencies().add(Constants.Configurations.MINECRAFT_NAMED, | 		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() { | 	private void invalidateJars() { | ||||||
| 		File dir = getJarDirectory(getExtension().getUserCache(), PROJECT_MAPPED_CLASSIFIER); | 		File dir = getJarDirectory(getExtension().getUserCache(), projectMappedClassifier); | ||||||
| 
 | 
 | ||||||
| 		if (dir.exists()) { | 		if (dir.exists()) { | ||||||
| 			getProject().getLogger().warn("Invalidating project jars"); | 			getProject().getLogger().warn("Invalidating project jars"); | ||||||
|  | @ -87,7 +87,7 @@ public class MinecraftProcessedProvider extends MinecraftMappedProvider { | ||||||
| 	public void initFiles(MinecraftProvider minecraftProvider, MappingsProvider mappingsProvider) { | 	public void initFiles(MinecraftProvider minecraftProvider, MappingsProvider mappingsProvider) { | ||||||
| 		super.initFiles(minecraftProvider, 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 | 	@Override | ||||||
|  |  | ||||||
|  | @ -144,8 +144,6 @@ public class MinecraftMappedProvider extends DependencyProvider { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	protected void addDependencies(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) { | 	protected void addDependencies(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) { | ||||||
| 		getProject().getRepositories().flatDir(repository -> repository.dir(getJarDirectory(getExtension().getUserCache(), "mapped"))); |  | ||||||
| 
 |  | ||||||
| 		getProject().getDependencies().add(Constants.Configurations.MINECRAFT_NAMED, | 		getProject().getDependencies().add(Constants.Configurations.MINECRAFT_NAMED, | ||||||
| 				getProject().getDependencies().module("net.minecraft:minecraft:" + getJarVersionString("mapped"))); | 				getProject().getDependencies().module("net.minecraft:minecraft:" + getJarVersionString("mapped"))); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -22,36 +22,31 @@ | ||||||
|  * SOFTWARE. |  * 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 { | class DependencyResolutionManagementTest extends Specification implements ProjectTestTrait { | ||||||
| 	public static void setup(Project project) { |     @Override | ||||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); |     String name() { | ||||||
|  |         "dependencyResolutionManagement" | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| 		project.getRepositories().flatDir(repo -> { |     @Unroll | ||||||
| 			repo.setName("UserLocalCacheFiles"); |     def "build (gradle #gradle)"() { | ||||||
| 			repo.dir(extension.getRootProjectBuildCache()); |         when: | ||||||
| 		}); |             def result = create("build", gradle) | ||||||
|  |         then: | ||||||
|  |             result.task(":basic:build").outcome == SUCCESS | ||||||
|  |             result.task(":projmap:build").outcome == SUCCESS | ||||||
| 
 | 
 | ||||||
| 		project.getRepositories().maven(repo -> { |         where: | ||||||
| 			repo.setName("UserLocalRemappedMods"); |         gradle              | _ | ||||||
| 			repo.setUrl(extension.getRemappedModCache()); |         DEFAULT_GRADLE      | _ | ||||||
| 		}); |         PRE_RELEASE_GRADLE  | _ | ||||||
| 
 |  | ||||||
| 		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(); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -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. | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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 | ||||||
|  | @ -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!"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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!"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 453 B | 
|  | @ -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": "*" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | { | ||||||
|  |   "required": true, | ||||||
|  |   "minVersion": "0.8", | ||||||
|  |   "package": "net.fabricmc.example.mixin", | ||||||
|  |   "compatibilityLevel": "JAVA_8", | ||||||
|  |   "mixins": [ | ||||||
|  |   ], | ||||||
|  |   "client": [ | ||||||
|  |     "ExampleMixin" | ||||||
|  |   ], | ||||||
|  |   "injectors": { | ||||||
|  |     "defaultRequire": 1 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -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. | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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 | ||||||
|  | @ -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!"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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!"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 453 B | 
|  | @ -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" | ||||||
|  | } | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | accessWidener   v1   named | ||||||
|  | extendable   class   net/minecraft/fluid/FluidState | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | { | ||||||
|  |   "required": true, | ||||||
|  |   "minVersion": "0.8", | ||||||
|  |   "package": "net.fabricmc.example.mixin", | ||||||
|  |   "compatibilityLevel": "JAVA_8", | ||||||
|  |   "mixins": [ | ||||||
|  |   ], | ||||||
|  |   "client": [ | ||||||
|  |     "ExampleMixin" | ||||||
|  |   ], | ||||||
|  |   "injectors": { | ||||||
|  |     "defaultRequire": 1 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -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' | ||||||
		Loading…
	
		Reference in a new issue