Start on 0.2.1
This commit is contained in:
		
							parent
							
								
									c452b3ae8a
								
							
						
					
					
						commit
						02e9616622
					
				
					 5 changed files with 134 additions and 6 deletions
				
			
		|  | @ -11,7 +11,7 @@ targetCompatibility = 1.8 | ||||||
| 
 | 
 | ||||||
| group = 'net.fabricmc' | group = 'net.fabricmc' | ||||||
| archivesBaseName = project.name | archivesBaseName = project.name | ||||||
| version = '0.2.0-SNAPSHOT' | version = '0.2.1-SNAPSHOT' | ||||||
| 
 | 
 | ||||||
| def build = "local" | def build = "local" | ||||||
| def ENV = System.getenv() | def ENV = System.getenv() | ||||||
|  |  | ||||||
|  | @ -33,10 +33,7 @@ import net.fabricmc.loom.task.RemapSourcesJar; | ||||||
| import net.fabricmc.loom.util.Constants; | import net.fabricmc.loom.util.Constants; | ||||||
| import net.fabricmc.loom.util.LoomDependencyManager; | import net.fabricmc.loom.util.LoomDependencyManager; | ||||||
| import net.fabricmc.loom.util.SetupIntelijRunConfigs; | import net.fabricmc.loom.util.SetupIntelijRunConfigs; | ||||||
| import org.gradle.api.Plugin; | import org.gradle.api.*; | ||||||
| import org.gradle.api.Project; |  | ||||||
| import org.gradle.api.Task; |  | ||||||
| import org.gradle.api.UnknownTaskException; |  | ||||||
| import org.gradle.api.artifacts.Configuration; | import org.gradle.api.artifacts.Configuration; | ||||||
| import org.gradle.api.artifacts.dsl.DependencyHandler; | import org.gradle.api.artifacts.dsl.DependencyHandler; | ||||||
| import org.gradle.api.artifacts.repositories.MavenArtifactRepository; | import org.gradle.api.artifacts.repositories.MavenArtifactRepository; | ||||||
|  | @ -65,6 +62,9 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 	public void apply(Project target) { | 	public void apply(Project target) { | ||||||
| 		this.project = target; | 		this.project = target; | ||||||
| 
 | 
 | ||||||
|  | 		//Done to ensure the child projects are built before the root project | ||||||
|  | 		this.project.evaluationDependsOnChildren(); | ||||||
|  | 
 | ||||||
| 		if(isRootProject(target)){ | 		if(isRootProject(target)){ | ||||||
| 			project.getLogger().lifecycle("Fabric Loom: " + AbstractPlugin.class.getPackage().getImplementationVersion()); | 			project.getLogger().lifecycle("Fabric Loom: " + AbstractPlugin.class.getPackage().getImplementationVersion()); | ||||||
| 		} | 		} | ||||||
|  | @ -93,6 +93,9 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 		Configuration minecraftConfig = project.getConfigurations().maybeCreate(Constants.MINECRAFT); | 		Configuration minecraftConfig = project.getConfigurations().maybeCreate(Constants.MINECRAFT); | ||||||
| 		minecraftConfig.setTransitive(false); | 		minecraftConfig.setTransitive(false); | ||||||
| 
 | 
 | ||||||
|  | 		Configuration includeConfig = project.getConfigurations().maybeCreate(Constants.INCLUDE); | ||||||
|  | 		includeConfig.setTransitive(false); // Dont get transitive deps | ||||||
|  | 
 | ||||||
| 		project.getConfigurations().maybeCreate(Constants.MAPPINGS); | 		project.getConfigurations().maybeCreate(Constants.MAPPINGS); | ||||||
| 
 | 
 | ||||||
| 		configureIDEs(); | 		configureIDEs(); | ||||||
|  | @ -247,7 +250,7 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 			project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace")); | 			project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace")); | ||||||
| 			project1.getTasks().getByName("eclipse").finalizedBy(project1.getTasks().getByName("genEclipseRuns")); | 			project1.getTasks().getByName("eclipse").finalizedBy(project1.getTasks().getByName("genEclipseRuns")); | ||||||
| 
 | 
 | ||||||
| 			if(extension.autoGenIDERuns){ | 			if(extension.autoGenIDERuns && isRootProject(project1)){ | ||||||
| 				SetupIntelijRunConfigs.setup(project1); | 				SetupIntelijRunConfigs.setup(project1); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -265,6 +268,8 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 				remapJarTask.doLast(task -> project1.getArtifacts().add("archives", remapJarTask.jar)); | 				remapJarTask.doLast(task -> project1.getArtifacts().add("archives", remapJarTask.jar)); | ||||||
| 				remapJarTask.dependsOn(project1.getTasks().getByName("jar")); | 				remapJarTask.dependsOn(project1.getTasks().getByName("jar")); | ||||||
| 				project1.getTasks().getByName("build").dependsOn(remapJarTask); | 				project1.getTasks().getByName("build").dependsOn(remapJarTask); | ||||||
|  | 				//Run all the sub project remap jars tasks before the root projects jar, this is to allow us to include projects | ||||||
|  | 				project1.subprojects(subProject -> remapJarTask.dependsOn(subProject.getTasksByName("remapJar", false))); | ||||||
| 
 | 
 | ||||||
| 				try { | 				try { | ||||||
| 					AbstractArchiveTask sourcesTask = (AbstractArchiveTask) project1.getTasks().getByName("sourcesJar"); | 					AbstractArchiveTask sourcesTask = (AbstractArchiveTask) project1.getTasks().getByName("sourcesJar"); | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ public class Constants { | ||||||
| 
 | 
 | ||||||
| 	public static final String COMPILE_MODS = "modCompile"; | 	public static final String COMPILE_MODS = "modCompile"; | ||||||
| 	public static final String COMPILE_MODS_MAPPED = "modCompileMapped"; | 	public static final String COMPILE_MODS_MAPPED = "modCompileMapped"; | ||||||
|  | 	public static final String INCLUDE = "include"; | ||||||
| 	public static final String MINECRAFT = "minecraft"; | 	public static final String MINECRAFT = "minecraft"; | ||||||
| 	public static final String MINECRAFT_DEPENDENCIES = "minecraftLibraries"; | 	public static final String MINECRAFT_DEPENDENCIES = "minecraftLibraries"; | ||||||
| 	public static final String MINECRAFT_INTERMEDIARY = "minecraftIntermediary"; | 	public static final String MINECRAFT_INTERMEDIARY = "minecraftIntermediary"; | ||||||
|  |  | ||||||
|  | @ -117,6 +117,10 @@ public class ModRemapper { | ||||||
| 			project.getLogger().debug("Transformed mixin reference maps in output JAR!"); | 			project.getLogger().debug("Transformed mixin reference maps in output JAR!"); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if (NestedJars.addNestedJars(project, modJarOutput)) { | ||||||
|  | 			project.getLogger().debug("Added nested jar paths to mod json"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		try { | 		try { | ||||||
| 			if (modJar.exists()) { | 			if (modJar.exists()) { | ||||||
| 				Files.move(modJar, modJarUnmappedCopy); | 				Files.move(modJar, modJarUnmappedCopy); | ||||||
|  |  | ||||||
							
								
								
									
										118
									
								
								src/main/java/net/fabricmc/loom/util/NestedJars.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/main/java/net/fabricmc/loom/util/NestedJars.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,118 @@ | ||||||
|  | /* | ||||||
|  |  * 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.util; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.Gson; | ||||||
|  | import com.google.gson.GsonBuilder; | ||||||
|  | import com.google.gson.JsonArray; | ||||||
|  | import com.google.gson.JsonObject; | ||||||
|  | import net.fabricmc.loom.task.RemapJar; | ||||||
|  | import org.gradle.api.Project; | ||||||
|  | import org.gradle.api.Task; | ||||||
|  | import org.gradle.api.artifacts.Configuration; | ||||||
|  | import org.gradle.api.artifacts.Dependency; | ||||||
|  | import org.gradle.api.artifacts.DependencySet; | ||||||
|  | import org.gradle.api.artifacts.ProjectDependency; | ||||||
|  | import org.zeroturnaround.zip.FileSource; | ||||||
|  | import org.zeroturnaround.zip.ZipEntrySource; | ||||||
|  | import org.zeroturnaround.zip.ZipUtil; | ||||||
|  | import org.zeroturnaround.zip.transform.StringZipEntryTransformer; | ||||||
|  | import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.zip.ZipEntry; | ||||||
|  | 
 | ||||||
|  | public class NestedJars { | ||||||
|  | 
 | ||||||
|  | 	private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); | ||||||
|  | 
 | ||||||
|  | 	public static boolean addNestedJars(Project project, File modJar) { | ||||||
|  | 		if (getContainedJars(project).isEmpty()) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		ZipUtil.addEntries(modJar, getContainedJars(project).stream().map(file -> new FileSource("META-INF/jars/" + file.getName(), file)).toArray(ZipEntrySource[]::new)); | ||||||
|  | 
 | ||||||
|  | 		return ZipUtil.transformEntries(modJar, single(new ZipEntryTransformerEntry("fabric.mod.json", new StringZipEntryTransformer() { | ||||||
|  | 			@Override | ||||||
|  | 			protected String transform(ZipEntry zipEntry, String input) throws IOException { | ||||||
|  | 				JsonObject json = GSON.fromJson(input, JsonObject.class); | ||||||
|  | 				JsonArray nestedJars = json.getAsJsonArray("jars"); | ||||||
|  | 				if (nestedJars == null || !json.has("jars")) { | ||||||
|  | 					nestedJars = new JsonArray(); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				for (File file : getContainedJars(project)) { | ||||||
|  | 					JsonObject jsonObject = new JsonObject(); | ||||||
|  | 					jsonObject.addProperty("file", "META-INF/jars/" + file.getName()); | ||||||
|  | 					nestedJars.add(jsonObject); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				json.add("jars", nestedJars); | ||||||
|  | 
 | ||||||
|  | 				return GSON.toJson(json); | ||||||
|  | 			} | ||||||
|  | 		}))); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static List<File> getContainedJars(Project project) { | ||||||
|  | 
 | ||||||
|  | 		List<File> fileList = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 		Configuration configuration = project.getConfigurations().getByName(Constants.INCLUDE); | ||||||
|  | 		DependencySet dependencies = configuration.getDependencies(); | ||||||
|  | 		for (Dependency dependency : dependencies) { | ||||||
|  | 			if (dependency instanceof ProjectDependency) { | ||||||
|  | 				ProjectDependency projectDependency = (ProjectDependency) dependency; | ||||||
|  | 				Project dependencyProject = projectDependency.getDependencyProject(); | ||||||
|  | 
 | ||||||
|  | 				//TODO change this to allow just normal jar tasks, so a project can have a none loom sub project | ||||||
|  | 				for (Task task : dependencyProject.getTasksByName("remapJar", false)) { | ||||||
|  | 					if (task instanceof RemapJar) { | ||||||
|  | 						fileList.add(((RemapJar) task).jar); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				fileList.addAll(configuration.files(dependency)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		for (File file : fileList) { | ||||||
|  | 			if (!file.exists()) { | ||||||
|  | 				throw new RuntimeException("Failed to include nested jars, as it could not be found @ " + file.getAbsolutePath()); | ||||||
|  | 			} | ||||||
|  | 			if (file.isDirectory() || !file.getName().endsWith(".jar")) { | ||||||
|  | 				throw new RuntimeException("Failed to include nested jars, as file was not a jar: " + file.getAbsolutePath()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return fileList; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static ZipEntryTransformerEntry[] single(ZipEntryTransformerEntry element) { | ||||||
|  | 		return new ZipEntryTransformerEntry[]{element}; | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue