Fix Forge setup ordering, centralise Forge cache code

The setup of dependency providers must happen after the custom repositories
added by Loom are finalised, but they're modified by the library processor
system. Therefore, we need to
1. Initialise dependency providers later.
2. Replace usages of specific dependency providers with (potentially slower)
   alternatives that don't resolve any dependencies.
This commit is contained in:
Juuz
2023-04-30 01:00:58 +03:00
parent 9dda8bbfb8
commit 3d74e11167
7 changed files with 70 additions and 26 deletions

View File

@@ -194,10 +194,6 @@ public abstract class CompileConfiguration implements Runnable {
extension.setMinecraftProvider(minecraftProvider);
minecraftProvider.provideFirst();
// This needs to run after MinecraftProvider.initFiles
// but before MinecraftPatchedProvider.provide.
setupDependencyProviders(project, extension);
if (!extension.isForge()) {
minecraftProvider.provide();
}
@@ -207,10 +203,18 @@ public abstract class CompileConfiguration implements Runnable {
extension.setMappingConfiguration(mappingConfiguration);
if (extension.isForge()) {
ForgeLibrariesProvider.provide(mappingConfiguration, project);
minecraftProvider.provide();
}
// This needs to run after MinecraftProvider.initFiles and MinecraftLibraryProvider.provide
// but before MinecraftPatchedProvider.provide.
setupDependencyProviders(project, extension);
if (extension.isForge()) {
ForgeLibrariesProvider.provide(mappingConfiguration, project);
((ForgeMinecraftProvider) minecraftProvider).getPatchedProvider().provide();
}
mappingConfiguration.setupPost(project);
mappingConfiguration.applyToProject(getProject(), mappingsDep);

View File

@@ -77,9 +77,9 @@ public final class FieldMigratedMappingConfiguration extends MappingConfiguratio
@Override
protected void setup(Project project, SharedServiceManager serviceManager, MinecraftProvider minecraftProvider, Path inputJar) throws IOException {
LoomGradleExtension extension = LoomGradleExtension.get(project);
PatchProvider patchProvider = extension.getPatchProvider();
migratedFieldsCache = patchProvider.getProjectCacheFolder().resolve("migrated-fields.json");
final Path forgeCache = ForgeProvider.getCurrentForgeCache(project);
Files.createDirectories(forgeCache);
migratedFieldsCache = forgeCache.resolve("migrated-fields.json");
migratedFields.clear();
if (minecraftProvider.refreshDeps()) {
@@ -99,8 +99,8 @@ public final class FieldMigratedMappingConfiguration extends MappingConfiguratio
super.setup(project, serviceManager, minecraftProvider, inputJar);
}
public static String createForgeMappingsIdentifier(LoomGradleExtension extension, String mappingsName, String version, String classifier, String minecraftVersion) {
return FieldMigratedMappingConfiguration.createMappingsIdentifier(mappingsName, version, classifier, minecraftVersion) + "-forge-" + extension.getForgeProvider().getVersion().getCombined();
public static String createForgeMappingsIdentifier(Project project, String mappingsName, String version, String classifier, String minecraftVersion) {
return FieldMigratedMappingConfiguration.createMappingsIdentifier(mappingsName, version, classifier, minecraftVersion) + "-forge-" + ForgeProvider.getCombinedForgeVersion(project);
}
@Override

View File

@@ -1,7 +1,7 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2020-2021 FabricMC
* Copyright (c) 2020-2023 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
@@ -25,9 +25,13 @@
package net.fabricmc.loom.configuration.providers.forge;
import java.io.File;
import java.nio.file.Path;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency;
import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.configuration.DependencyInfo;
import net.fabricmc.loom.util.Constants;
@@ -74,6 +78,53 @@ public class ForgeProvider extends DependencyProvider {
return Constants.Configurations.FORGE;
}
/**
* Gets the full/combined Forge version <em>without</em> resolving dependencies
* that haven't been resolved yet.
*
* @param project the Gradle project
* @return the Forge version
*/
public static String getCombinedForgeVersion(Project project) {
final LoomGradleExtension extension = LoomGradleExtension.get(project);
if (extension.getDependencyProviders() != null) {
return extension.getForgeProvider().getVersion().getCombined();
}
final Configuration configuration = project.getConfigurations().getByName(Constants.Configurations.FORGE);
for (Dependency dependency : configuration.getDependencies()) {
if (dependency.getVersion() != null) {
return dependency.getVersion();
}
}
throw new RuntimeException("Could not find Forge version. Searched " + configuration.getDependencies().size() + " dependencies");
}
/**
* {@return the Forge cache directory}
*
* @param project the project
* @param version the Forge version
*/
public static Path getForgeCache(Project project, String version) {
return LoomGradleExtension.get(project).getMinecraftProvider()
.dir("forge/" + version).toPath();
}
/**
* {@return the cache directory for the current Forge version}
*
* <p>This method is slower than {@link #getForgeCache} if you already know the Forge version.
*
* @param project the project
*/
public static Path getCurrentForgeCache(Project project) {
return getForgeCache(project, getCombinedForgeVersion(project));
}
public static final class ForgeVersion {
private final String combined;
private final String minecraftVersion;

View File

@@ -135,7 +135,7 @@ public class MinecraftPatchedProvider {
private void initPatchedFiles() {
String forgeVersion = getExtension().getForgeProvider().getVersion().getCombined();
Path forgeWorkingDir = minecraftProvider.dir("forge/" + forgeVersion).toPath();
Path forgeWorkingDir = ForgeProvider.getForgeCache(project, forgeVersion);
String patchId = "forge-" + forgeVersion + "-";
minecraftProvider.setJarPrefix(patchId);

View File

@@ -39,7 +39,6 @@ import net.fabricmc.loom.util.FileSystemUtil;
public class PatchProvider extends DependencyProvider {
public Path clientPatches;
public Path serverPatches;
public Path projectCacheFolder;
public PatchProvider(Project project) {
super(project);
@@ -62,7 +61,7 @@ public class PatchProvider extends DependencyProvider {
}
private void init(String forgeVersion) {
projectCacheFolder = getMinecraftProvider().dir("forge/" + forgeVersion).toPath();
final Path projectCacheFolder = ForgeProvider.getForgeCache(getProject(), forgeVersion);
clientPatches = projectCacheFolder.resolve("patches-client.lzma");
serverPatches = projectCacheFolder.resolve("patches-server.lzma");
@@ -73,10 +72,6 @@ public class PatchProvider extends DependencyProvider {
}
}
public Path getProjectCacheFolder() {
return projectCacheFolder;
}
@Override
public String getTargetConfig() {
return Constants.Configurations.FORGE_INSTALLER;

View File

@@ -1,7 +1,7 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2022 FabricMC
* Copyright (c) 2022-2023 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
@@ -40,12 +40,6 @@ public final class MergedForgeMinecraftProvider extends MergedMinecraftProvider
this.patchedProvider = new MinecraftPatchedProvider(configContext.project(), this, MinecraftPatchedProvider.Type.MERGED);
}
@Override
public void provide() throws Exception {
super.provide();
patchedProvider.provide();
}
@Override
protected void mergeJars() throws IOException {
// Don't merge jars in the superclass

View File

@@ -125,7 +125,7 @@ public class MappingConfiguration {
String mappingsIdentifier;
if (extension.isForge()) {
mappingsIdentifier = FieldMigratedMappingConfiguration.createForgeMappingsIdentifier(extension, mappingsName, version, getMappingsClassifier(dependency, jarInfo.v2()), minecraftProvider.minecraftVersion());
mappingsIdentifier = FieldMigratedMappingConfiguration.createForgeMappingsIdentifier(project, mappingsName, version, getMappingsClassifier(dependency, jarInfo.v2()), minecraftProvider.minecraftVersion());
} else {
mappingsIdentifier = createMappingsIdentifier(mappingsName, version, getMappingsClassifier(dependency, jarInfo.v2()), minecraftProvider.minecraftVersion());
}