Skip to content

Commit

Permalink
Implement dependency handling for runtime only dependencies.
Browse files Browse the repository at this point in the history
  • Loading branch information
marchermans committed Nov 19, 2023
1 parent 3a63bef commit c35e045
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 50 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.neoforged.gradle.common.runs.run;

import net.neoforged.gradle.dsl.common.runs.run.RunDependency;
import net.neoforged.gradle.dsl.common.util.ConfigurationUtils;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.ResolvedConfiguration;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.provider.Property;

import javax.inject.Inject;

public abstract class ConfigurationRunDependencyImpl implements RunDependency {

@Inject
public ConfigurationRunDependencyImpl(Project project, Configuration dependency) {
getIdentity().convention(dependency.toString());
getDependency().from(project.provider(() -> {
final ResolvedConfiguration resolvedConfiguration = dependency.getResolvedConfiguration();
final ConfigurableFileCollection files = project.files();
return files.from(resolvedConfiguration.getFiles());
}));
}

@Override
public abstract ConfigurableFileCollection getDependency();

@Override
public abstract Property<String> getIdentity();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.neoforged.gradle.dsl.common.runs.run.RunDependency;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency;

import javax.inject.Inject;
Expand Down Expand Up @@ -70,4 +71,9 @@ public RunDependency project(Map<String, ?> notation) {
final Dependency dependency = project.getDependencies().project(notation);
return project.getObjects().newInstance(RunDependencyImpl.class, project, dependency);
}

@Override
public RunDependency configuration(Configuration notation) {
return project.getObjects().newInstance(ConfigurationRunDependencyImpl.class, project, notation);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
Expand Down Expand Up @@ -172,7 +171,7 @@ public VersionJson getVersionJson() {
}

public void configureRun(RunImpl run) {
final Map<String, String> runtimeInterpolationData = buildRunInterpolationData();
final Map<String, String> runtimeInterpolationData = buildRunInterpolationData(run);

final Map<String, String> workingInterpolationData = new HashMap<>(runtimeInterpolationData);
workingInterpolationData.put("source_roots", RunsUtil.buildGradleModClasses(run.getModSources()).get());
Expand All @@ -191,7 +190,7 @@ public void configureRun(RunImpl run) {
}
}

protected Map<String, String> buildRunInterpolationData() {
protected Map<String, String> buildRunInterpolationData(RunImpl run) {
final Map<String, String> interpolationData = Maps.newHashMap();

interpolationData.put("runtime_name", specification.getVersionedName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ private RunsUtil() {
throw new IllegalStateException("Tried to create utility class!");
}

public static String createTaskName(final Run run) {
return createTaskName(run.getName());
}

public static String createTaskName(final String prefix, final Run run) {
return createTaskName(prefix, run.getName());
}

public static Run create(final Project project, final String name) {
final RunImpl run = project.getObjects().newInstance(RunImpl.class, project, name);

Expand Down Expand Up @@ -112,11 +120,15 @@ public static Provider<String> buildGradleModClasses(final ListProperty<SourceSe
}

private static String createTaskName(final String runName) {
return createTaskName("run", runName);
}

private static String createTaskName(final String prefix, final String runName) {
final String conventionTaskName = runName.replaceAll("[^a-zA-Z0-9\\-_]", "");
if (conventionTaskName.startsWith("run")) {
return conventionTaskName;
}

return "run" + StringCapitalizationUtils.capitalize(conventionTaskName);
return prefix + StringCapitalizationUtils.capitalize(conventionTaskName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import net.minecraftforge.gdi.BaseDSLElement
import net.minecraftforge.gdi.annotations.ClosureEquivalent
import net.minecraftforge.gdi.annotations.DSLProperty
import org.gradle.api.Action
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.provider.ListProperty
import org.gradle.api.tasks.Input
Expand Down Expand Up @@ -84,4 +85,12 @@ interface DependencyHandler extends BaseDSLElement<DependencyHandler> {
* @return The run dependency.
*/
RunDependency project(Map<String, ?> notation);

/**
* Creates a new run dependency from the given configuration notation.
*
* @param notation The configuration to use.
* @return The run dependency.
*/
RunDependency configuration(Configuration notation);
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ public void configureRun(RunImpl run) {
}

@Override
public Map<String, String> buildRunInterpolationData() {
final Map<String, String> interpolationData = new HashMap<>(super.buildRunInterpolationData());
public Map<String, String> buildRunInterpolationData(RunImpl run) {
final Map<String, String> interpolationData = new HashMap<>(super.buildRunInterpolationData(run));

interpolationData.put("mcp_version", neoform.getVersion());
interpolationData.put("mcp_mappings", new File(unpackedneoformZipDirectory, "config/joined.srg").getAbsolutePath());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ public void runtime(final String neoFormVersion, Directory patches, Directory re
profile.processor(project, processor -> {
processor.server();
processor.getJar().set("net.minecraftforge:installertools:1.3.0");
processor.arguments("--task", "EXTRACT_FILES", "--archive", "{INSTALLER}",
processor.getArguments().addAll("--task", "EXTRACT_FILES", "--archive", "{INSTALLER}",

"--from", "data/run.sh", "--to", "{ROOT}/run.sh", "--exec", "{ROOT}/run.sh",

Expand All @@ -378,42 +378,42 @@ public void runtime(final String neoFormVersion, Directory patches, Directory re
profile.processor(project, processor -> {
processor.server();
processor.getJar().set("net.minecraftforge:installertools:1.3.0");
processor.arguments("--task", "BUNDLER_EXTRACT", "--input", "{MINECRAFT_JAR}", "--output", "{ROOT}/libraries/", "--libraries");
processor.getArguments().addAll("--task", "BUNDLER_EXTRACT", "--input", "{MINECRAFT_JAR}", "--output", "{ROOT}/libraries/", "--libraries");
});
profile.processor(project, processor -> {
processor.server();
processor.getJar().set("net.minecraftforge:installertools:1.3.0");
processor.arguments("--task", "BUNDLER_EXTRACT", "--input", "{MINECRAFT_JAR}", "--output", "{MC_UNPACKED}", "--jar-only");
processor.getArguments().addAll("--task", "BUNDLER_EXTRACT", "--input", "{MINECRAFT_JAR}", "--output", "{MC_UNPACKED}", "--jar-only");
});
profile.processor(project, processor -> {
processor.getJar().set("net.minecraftforge:installertools:1.3.0");
processor.arguments("--task", "MCP_DATA", "--input", String.format("[%s]", runtimeDefinition.getJoinedNeoFormRuntimeDefinition().getSpecification().getNeoFormArtifact().toString()), "--output", "{MAPPINGS}", "--key", "mappings");
processor.getArguments().addAll("--task", "MCP_DATA", "--input", String.format("[%s]", runtimeDefinition.getJoinedNeoFormRuntimeDefinition().getSpecification().getNeoFormArtifact().toString()), "--output", "{MAPPINGS}", "--key", "mappings");
});
profile.processor(project, processor -> {
processor.getJar().set("net.minecraftforge:installertools:1.3.0");
processor.arguments("--task", "DOWNLOAD_MOJMAPS", "--version", runtimeDefinition.getSpecification().getMinecraftVersion(), "--side", "{SIDE}", "--output", "{MOJMAPS}");
processor.getArguments().addAll("--task", "DOWNLOAD_MOJMAPS", "--version", runtimeDefinition.getSpecification().getMinecraftVersion(), "--side", "{SIDE}", "--output", "{MOJMAPS}");
});
profile.processor(project, processor -> {
processor.getJar().set("net.minecraftforge:installertools:1.3.0");
processor.arguments("--task", "MERGE_MAPPING", "--left", "{MAPPINGS}", "--right", "{MOJMAPS}", "--output", "{MERGED_MAPPINGS}", "--classes", "--fields", "--methods", "--reverse-right");
processor.getArguments().addAll("--task", "MERGE_MAPPING", "--left", "{MAPPINGS}", "--right", "{MOJMAPS}", "--output", "{MERGED_MAPPINGS}", "--classes", "--fields", "--methods", "--reverse-right");
});
profile.processor(project, processor -> {
processor.client();
processor.getJar().set("net.minecraftforge:jarsplitter:1.1.4");
processor.arguments("--input", "{MINECRAFT_JAR}", "--slim", "{MC_SLIM}", "--extra", "{MC_EXTRA}", "--srg", "{MERGED_MAPPINGS}");
processor.getArguments().addAll("--input", "{MINECRAFT_JAR}", "--slim", "{MC_SLIM}", "--extra", "{MC_EXTRA}", "--srg", "{MERGED_MAPPINGS}");
});
profile.processor(project, processor -> {
processor.server();
processor.getJar().set("net.minecraftforge:jarsplitter:1.1.4");
processor.arguments("--input", "{MC_UNPACKED}", "--slim", "{MC_SLIM}", "--extra", "{MC_EXTRA}", "--srg", "{MERGED_MAPPINGS}");
processor.getArguments().addAll("--input", "{MC_UNPACKED}", "--slim", "{MC_SLIM}", "--extra", "{MC_EXTRA}", "--srg", "{MERGED_MAPPINGS}");
});
profile.processor(project, processor -> {
processor.getJar().set(Constants.FART);
processor.arguments("--input", "{MC_SLIM}", "--output", "{MC_SRG}", "--names", "{MERGED_MAPPINGS}", "--ann-fix", "--ids-fix", "--src-fix", "--record-fix");
processor.getArguments().addAll("--input", "{MC_SLIM}", "--output", "{MC_SRG}", "--names", "{MERGED_MAPPINGS}", "--ann-fix", "--ids-fix", "--src-fix", "--record-fix");
});
profile.processor(project, processor -> {
processor.getJar().set("net.minecraftforge:binarypatcher:1.1.1");
processor.arguments("--clean", "{MC_SRG}", "--output", "{PATCHED}", "--apply", "{BINPATCH}");
processor.getArguments().addAll("--clean", "{MC_SRG}", "--output", "{PATCHED}", "--apply", "{BINPATCH}");
});

profile.getLibraries().add(Library.fromOutput(signUniversalJar, project, "net.neoforged", "neoforge", project.getVersion().toString(), "universal"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ public TaskProvider<? extends WithOutput> getListLibrariesTaskProvider() {
}

@Override
protected Map<String, String> buildRunInterpolationData() {
final Map<String, String> interpolationData = joinedNeoFormRuntimeDefinition.buildRunInterpolationData();
protected Map<String, String> buildRunInterpolationData(RunImpl run) {
final Map<String, String> interpolationData = joinedNeoFormRuntimeDefinition.buildRunInterpolationData(run);
return interpolationData;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import net.neoforged.gradle.common.runtime.tasks.DownloadAssets;
import net.neoforged.gradle.common.runtime.tasks.ExtractNatives;
import net.neoforged.gradle.common.util.VersionJson;
import net.neoforged.gradle.common.util.run.RunsUtil;
import net.neoforged.gradle.dsl.common.runtime.definition.Definition;
import net.neoforged.gradle.dsl.common.tasks.WithOutput;
import net.neoforged.gradle.dsl.common.util.CommonRuntimeUtils;
import net.neoforged.gradle.dsl.common.util.ConfigurationUtils;
import net.neoforged.gradle.dsl.userdev.configurations.UserdevProfile;
import net.neoforged.gradle.dsl.userdev.runtime.definition.UserDevDefinition;
import net.neoforged.gradle.neoform.runtime.definition.NeoFormRuntimeDefinition;
Expand All @@ -21,6 +23,8 @@
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

Expand All @@ -32,7 +36,9 @@ public final class UserDevRuntimeDefinition extends CommonRuntimeDefinition<User
private final File unpackedUserDevJarDirectory;
private final UserdevProfile userdevConfiguration;
private final Configuration additionalUserDevDependencies;
private final TaskProvider<ClasspathSerializer> minecraftClasspathSerializer;

private final List<TaskProvider<ClasspathSerializer>> classpathSerializers = new ArrayList<>();
private TaskProvider<? extends WithOutput> repoWritingTask = null;

public UserDevRuntimeDefinition(@NotNull UserDevRuntimeSpecification specification, NeoFormRuntimeDefinition neoformRuntimeDefinition, File unpackedUserDevJarDirectory, UserdevProfile userdevConfiguration, Configuration additionalUserDevDependencies) {
super(specification, neoformRuntimeDefinition.getTasks(), neoformRuntimeDefinition.getSourceJarTask(), neoformRuntimeDefinition.getRawJarTask(), neoformRuntimeDefinition.getGameArtifactProvidingTasks(), neoformRuntimeDefinition.getMinecraftDependenciesConfiguration(), neoformRuntimeDefinition::configureAssociatedTask, neoformRuntimeDefinition.getVersionJson());
Expand All @@ -46,17 +52,6 @@ public UserDevRuntimeDefinition(@NotNull UserDevRuntimeSpecification specificati
ExtraJarDependencyManager.generateClientCoordinateFor(this.getSpecification().getMinecraftVersion())
)
);

this.minecraftClasspathSerializer = specification.getProject().getTasks().register(
CommonRuntimeUtils.buildStepName(getSpecification(), "writeMinecraftClasspath"),
ClasspathSerializer.class,
task -> {
this.additionalUserDevDependencies.getExtendsFrom().forEach(task.getInputFiles()::from);
task.getInputFiles().from(this.additionalUserDevDependencies);
task.getInputFiles().from(neoformRuntimeDefinition.getMinecraftDependenciesConfiguration());
}
);
configureAssociatedTask(this.minecraftClasspathSerializer);
}

@Override
Expand Down Expand Up @@ -89,9 +84,12 @@ public void setReplacedDependency(@NotNull Dependency dependency) {
@Override
public void onRepoWritten(@NotNull final TaskProvider<? extends WithOutput> finalRepoWritingTask) {
neoformRuntimeDefinition.onRepoWritten(finalRepoWritingTask);
this.minecraftClasspathSerializer.configure(task -> {

classpathSerializers.forEach(taskProvider -> taskProvider.configure(task -> {
task.getInputFiles().from(finalRepoWritingTask);
});
}));
classpathSerializers.clear();
this.repoWritingTask = finalRepoWritingTask;
}

@Override
Expand All @@ -108,27 +106,16 @@ public void onRepoWritten(@NotNull final TaskProvider<? extends WithOutput> fina
public @NotNull Map<String, String> getMappingVersionData() {
return neoformRuntimeDefinition.getMappingVersionData();
}

@Override
public void configureRun(RunImpl run) {
super.configureRun(run);
run.dependsOn(this.minecraftClasspathSerializer);
}


@NotNull
@Override
public TaskProvider<? extends WithOutput> getListLibrariesTaskProvider() {
return neoformRuntimeDefinition.getListLibrariesTaskProvider();
}

@NotNull
public TaskProvider<ClasspathSerializer> getMinecraftClasspathSerializer() {
return minecraftClasspathSerializer;
}

@Override
protected Map<String, String> buildRunInterpolationData() {
final Map<String, String> interpolationData = neoformRuntimeDefinition.buildRunInterpolationData();
protected Map<String, String> buildRunInterpolationData(RunImpl run) {
final Map<String, String> interpolationData = neoformRuntimeDefinition.buildRunInterpolationData(run);

if (userdevConfiguration.getModules() != null && !userdevConfiguration.getModules().get().isEmpty()) {
final String name = String.format("moduleResolverForgeUserDev%s", getSpecification().getVersionedName());
Expand All @@ -144,9 +131,32 @@ protected Map<String, String> buildRunInterpolationData() {

interpolationData.put("modules", modulesCfg.resolve().stream().map(File::getAbsolutePath).collect(Collectors.joining(File.pathSeparator)));
}

final TaskProvider<ClasspathSerializer> minecraftClasspathSerializer = getSpecification().getProject().getTasks().register(
RunsUtil.createTaskName("writeMinecraftClasspath", run),
ClasspathSerializer.class,
task -> {
this.additionalUserDevDependencies.getExtendsFrom().forEach(task.getInputFiles()::from);
task.getInputFiles().from(this.additionalUserDevDependencies);
task.getInputFiles().from(neoformRuntimeDefinition.getMinecraftDependenciesConfiguration());

interpolationData.put("minecraft_classpath_file", this.minecraftClasspathSerializer.get().getOutput().get().getAsFile().getAbsolutePath());

run.getDependencies().get().getRuntime().get().forEach(runDependency -> task.getInputFiles().from(runDependency.getDependency()));
}
);
configureAssociatedTask(minecraftClasspathSerializer);

interpolationData.put("minecraft_classpath_file", minecraftClasspathSerializer.get().getOutput().get().getAsFile().getAbsolutePath());

run.dependsOn(minecraftClasspathSerializer);

if (repoWritingTask == null) {
classpathSerializers.add(minecraftClasspathSerializer);
} else {
minecraftClasspathSerializer.configure(task -> {
task.getInputFiles().from(repoWritingTask);
});
}

return interpolationData;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public Optional<ServerLaunchInformation> getServerLaunchInformation() {
}

@Override
protected Map<String, String> buildRunInterpolationData() {
protected Map<String, String> buildRunInterpolationData(RunImpl run) {
final Map<String, String> interpolationData = Maps.newHashMap();

final String fgVersion = this.getClass().getPackage().getImplementationVersion();
Expand All @@ -100,7 +100,7 @@ public void configureRun(RunImpl run) {
run.getIsClient().set(true);
run.getIsSingleInstance().set(false);

final Map<String, String> interpolationData = Maps.newHashMap(buildRunInterpolationData());
final Map<String, String> interpolationData = Maps.newHashMap(buildRunInterpolationData(run));

interpolationData.put(InterpolationConstants.GAME_DIRECTORY, run.getWorkingDirectory().get().getAsFile().getAbsolutePath());
run.overrideJvmArguments(interpolate(run.getJvmArguments(), interpolationData, "$"));
Expand Down

0 comments on commit c35e045

Please sign in to comment.