Skip to content

Commit

Permalink
Implement support for dynamic runtime dependencies (#52)
Browse files Browse the repository at this point in the history
* Implement dependency handling for runtime only dependencies.

* Fix several issues caused by the latest changes.
  • Loading branch information
marchermans authored Nov 25, 2023
1 parent 902ae2c commit 0421559
Show file tree
Hide file tree
Showing 12 changed files with 144 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@
import org.gradle.plugins.ide.idea.IdeaPlugin;
import org.jetbrains.gradle.ext.IdeaExtPlugin;

import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

public class CommonProjectPlugin implements Plugin<Project> {

Expand Down Expand Up @@ -134,14 +136,21 @@ private void applyAfterEvaluate(final Project project) {

if (run.getConfigureFromDependencies().get()) {
final RunImpl runImpl = (RunImpl) run;

final Set<CommonRuntimeDefinition<?>> definitionSet = new HashSet<>();

runImpl.getModSources().get().forEach(sourceSet -> {
try {
final Optional<CommonRuntimeDefinition<?>> definition = TaskDependencyUtils.findRuntimeDefinition(project, sourceSet);
definition.ifPresent(def -> def.configureRun(runImpl));
definition.ifPresent(definitionSet::add);
} catch (MultipleDefinitionsFoundException e) {
throw new RuntimeException("Failed to configure run: " + run.getName() + " there are multiple runtime definitions found for the source set: " + sourceSet.getName(), e);
}
});

definitionSet.forEach(definition -> {
definition.configureRun(runImpl);
});
}
}
}));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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 {

private final Project project;

@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());
}));
this.project = project;
}

@Override
public Project getProject() {
return project;
}

@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 @@ -13,6 +13,8 @@

public abstract class RunDependencyImpl implements RunDependency {

private final Project project;

@Inject
public RunDependencyImpl(Project project, Dependency dependency) {
getIdentity().convention(dependency.toString());
Expand All @@ -22,8 +24,14 @@ public RunDependencyImpl(Project project, Dependency dependency) {
final ConfigurableFileCollection files = project.files();
return files.from(resolvedConfiguration.getFiles());
}));
this.project = project;
}


@Override
public Project getProject() {
return project;
}

@Override
public abstract ConfigurableFileCollection getDependency();

Expand Down
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
Loading

1 comment on commit 0421559

@BenDol
Copy link

@BenDol BenDol commented on 0421559 Nov 26, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.