Skip to content

Commit 77841ba

Browse files
committed
spilt dist
1 parent 846b2d7 commit 77841ba

17 files changed

Lines changed: 399 additions & 31 deletions

File tree

src/legacy/java/net/neoforged/moddevgradle/legacyforge/internal/LegacyForgeModDevPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ public void enable(Project project, LegacyForgeModdingSettings settings, LegacyF
154154
configurations.getByName(DataFileCollections.CONFIGURATION_ACCESS_TRANSFORMERS),
155155
configurations.getByName(DataFileCollections.CONFIGURATION_INTERFACE_INJECTION_DATA),
156156
versionCapabilities,
157-
settings.isDisableRecompilation());
157+
settings.isDisableRecompilation(),
158+
false);
158159

159160
var runs = ModDevRunWorkflow.create(
160161
project,

src/main/java/net/neoforged/moddevgradle/dsl/ModModel.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public ModModel() {
1515
// TODO: We could potentially do a bit of name validation
1616
getModSourceSets().convention(List.of());
1717
getModSourceSets().finalizeValueOnRead();
18+
getModClientSourceSets().convention(List.of());
19+
getModClientSourceSets().finalizeValueOnRead();
1820
}
1921

2022
@Override
@@ -23,7 +25,13 @@ public ModModel() {
2325
// Do not name getSourceSets or it will conflict with project.sourceSets in scripts.
2426
public abstract ListProperty<SourceSet> getModSourceSets();
2527

28+
public abstract ListProperty<SourceSet> getModClientSourceSets();
29+
2630
public void sourceSet(SourceSet sourceSet) {
2731
getModSourceSets().add(sourceSet);
2832
}
33+
34+
public void clientSourceSet(SourceSet sourceSet) {
35+
getModClientSourceSets().add(sourceSet);
36+
}
2937
}

src/main/java/net/neoforged/moddevgradle/dsl/ModdingVersionSettings.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package net.neoforged.moddevgradle.dsl;
22

3-
import java.util.HashSet;
4-
import java.util.Set;
5-
import javax.inject.Inject;
63
import net.neoforged.moddevgradle.internal.utils.ExtensionUtils;
74
import org.gradle.api.Project;
85
import org.gradle.api.tasks.SourceSet;
96
import org.jetbrains.annotations.Nullable;
107

8+
import javax.inject.Inject;
9+
import java.util.HashSet;
10+
import java.util.Set;
11+
1112
public abstract class ModdingVersionSettings {
1213
@Nullable
1314
private String version;
1415

1516
@Nullable
1617
private String neoFormVersion;
1718

19+
private boolean splitDist = false;
20+
1821
private Set<SourceSet> enabledSourceSets = new HashSet<>();
1922

2023
private boolean disableRecompilation = "true".equals(System.getenv("CI"));
@@ -77,4 +80,13 @@ public boolean isDisableRecompilation() {
7780
public void setDisableRecompilation(boolean disableRecompilation) {
7881
this.disableRecompilation = disableRecompilation;
7982
}
83+
84+
public boolean isSplitDist() {
85+
return splitDist;
86+
}
87+
88+
public void setSplitDist(boolean enable) {
89+
this.splitDist = enable;
90+
}
91+
8092
}

src/main/java/net/neoforged/moddevgradle/internal/EclipseIntegration.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ private void addEclipseLaunchConfiguration(Project project,
154154
}
155155

156156
// This is the actual main launch configuration that launches the game
157-
var modFoldersProvider = getModFoldersProvider(project, run.getLoadedMods(), null);
157+
boolean isClient = run.getType().get().startsWith("client");
158+
var modFoldersProvider = getModFoldersProvider(project, run.getLoadedMods(), null, isClient);
158159
var config = JavaApplicationLaunchConfig.builder(eclipseProjectName)
159160
.vmArgs(
160161
RunUtils.escapeJvmArg(RunUtils.getArgFileParameter(prepareTask.getVmArgsFile().get())),
@@ -168,12 +169,13 @@ private void addEclipseLaunchConfiguration(Project project,
168169

169170
protected static ModFoldersProvider getModFoldersProvider(Project project,
170171
Provider<Set<ModModel>> modsProvider,
171-
@Nullable Provider<ModModel> testedMod) {
172+
@Nullable Provider<ModModel> testedMod,
173+
boolean isClient) {
172174
var folders = RunUtils.buildModFolders(project, modsProvider, testedMod, (sourceSet, output) -> {
173175
output.from(RunUtils.findSourceSetProject(project, sourceSet).getProjectDir().toPath()
174176
.resolve("bin")
175177
.resolve(sourceSet.getName()));
176-
});
178+
}, isClient);
177179

178180
var modFoldersProvider = project.getObjects().newInstance(ModFoldersProvider.class);
179181
modFoldersProvider.getModFolders().set(folders);

src/main/java/net/neoforged/moddevgradle/internal/IntelliJIntegration.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public void configureTesting(Provider<Set<ModModel>> loadedMods,
122122
var intellijVmArgsFile = runArgsDir.map(dir -> dir.file("intellijVmArgs.txt"));
123123

124124
var outputDirectory = IntelliJOutputDirectoryValueSource.getIntellijOutputDirectory(project);
125-
var ideSpecificVmArgs = RunUtils.escapeJvmArg(getModFoldersProvider(project, outputDirectory, loadedMods, testedMod).getArgument());
125+
var ideSpecificVmArgs = RunUtils.escapeJvmArg(getModFoldersProvider(project, outputDirectory, loadedMods, testedMod, true).getArgument());
126126
try {
127127
var vmArgsFilePath = intellijVmArgsFile.get().getAsFile().toPath();
128128
Files.createDirectories(vmArgsFilePath.getParent());
@@ -185,7 +185,8 @@ private static void addIntelliJRunConfiguration(Project project,
185185
}
186186
appRun.setModuleName(getIntellijModuleName(project, sourceSet));
187187
appRun.setWorkingDirectory(run.getGameDirectory().get().getAsFile().getAbsolutePath());
188-
var modFoldersProvider = getModFoldersProvider(project, outputDirectory, run.getLoadedMods(), null);
188+
boolean isClient = run.getType().get().startsWith("client");
189+
var modFoldersProvider = getModFoldersProvider(project, outputDirectory, run.getLoadedMods(), null, isClient);
189190
appRun.setEnvs(RunUtils.replaceModClassesEnv(run, modFoldersProvider));
190191
appRun.setJvmArgs(
191192
RunUtils.escapeJvmArg(RunUtils.getArgFileParameter(prepareTask.getVmArgsFile().get()))
@@ -232,15 +233,16 @@ public boolean shouldUseCombinedSourcesAndClassesArtifact() {
232233
private static ModFoldersProvider getModFoldersProvider(Project project,
233234
@Nullable Function<Project, File> outputDirectory,
234235
Provider<Set<ModModel>> modsProvider,
235-
@Nullable Provider<ModModel> testedMod) {
236+
@Nullable Provider<ModModel> testedMod,
237+
boolean isClient) {
236238
Provider<Map<String, ModFolder>> folders;
237239
if (outputDirectory != null) {
238240
folders = RunUtils.buildModFolders(project, modsProvider, testedMod, (sourceSet, output) -> {
239241
var sourceSetDir = outputDirectory.apply(RunUtils.findSourceSetProject(project, sourceSet)).toPath().resolve(getIdeaOutName(sourceSet));
240242
output.from(sourceSetDir.resolve("classes"), sourceSetDir.resolve("resources"));
241-
});
243+
}, isClient);
242244
} else {
243-
folders = RunUtils.getModFoldersForGradle(project, modsProvider, testedMod);
245+
folders = RunUtils.getModFoldersForGradle(project, modsProvider, testedMod, isClient);
244246
}
245247

246248
var modFoldersProvider = project.getObjects().newInstance(ModFoldersProvider.class);

src/main/java/net/neoforged/moddevgradle/internal/ModDevArtifactsWorkflow.java

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.neoforged.moddevgradle.internal.utils.VersionCapabilitiesInternal;
1212
import net.neoforged.nfrtgradle.CreateMinecraftArtifacts;
1313
import net.neoforged.nfrtgradle.DownloadAssets;
14+
import net.neoforged.nfrtgradle.SplitMergedJar;
1415
import org.gradle.api.GradleException;
1516
import org.gradle.api.InvalidUserCodeException;
1617
import org.gradle.api.Named;
@@ -28,6 +29,7 @@
2829
import org.gradle.api.plugins.JavaPluginExtension;
2930
import org.gradle.api.provider.Provider;
3031
import org.gradle.api.tasks.SourceSet;
32+
import org.gradle.api.tasks.SourceSetContainer;
3133
import org.gradle.api.tasks.TaskProvider;
3234
import org.gradle.jvm.toolchain.JavaLanguageVersion;
3335
import org.gradle.jvm.toolchain.JavaToolchainService;
@@ -47,6 +49,7 @@ public record ModDevArtifactsWorkflow(
4749
TaskProvider<DownloadAssets> downloadAssets,
4850
Configuration runtimeDependencies,
4951
Configuration compileDependencies,
52+
Configuration clientExtraCompileDependencies,
5053
Provider<Directory> modDevBuildDir,
5154
Provider<Directory> artifactsBuildDir) {
5255

@@ -68,7 +71,8 @@ public static ModDevArtifactsWorkflow create(Project project,
6871
Configuration accessTransformers,
6972
Configuration interfaceInjectionData,
7073
VersionCapabilitiesInternal versionCapabilities,
71-
boolean disableRecompilation) {
74+
boolean disableRecompilation,
75+
boolean splitDist) {
7276
if (project.getExtensions().findByName(EXTENSION_NAME) != null) {
7377
throw new InvalidUserCodeException("You cannot enable modding in the same project twice.");
7478
}
@@ -115,6 +119,8 @@ public static ModDevArtifactsWorkflow create(Project project,
115119
spec.getDependencies().addLater(parchment.getParchmentArtifact().map(dependencyFactory::create));
116120
});
117121

122+
Function<WorkflowArtifact, Provider<RegularFile>> artifactPathStrategy = artifact -> artifactsBuildDir.map(dir -> dir.file(artifactNamingStrategy.getFilename(artifact)));
123+
118124
// it has to contain client-extra to be loaded by FML, and it must be added to the legacy CP
119125
var createArtifacts = tasks.register("createMinecraftArtifacts", CreateMinecraftArtifacts.class, task -> {
120126
task.setGroup(branding.internalTaskGroup());
@@ -151,8 +157,6 @@ public static ModDevArtifactsWorkflow create(Project project,
151157
task.getParchmentEnabled().set(parchment.getEnabled());
152158
task.getParchmentConflictResolutionPrefix().set(parchment.getConflictResolutionPrefix());
153159

154-
Function<WorkflowArtifact, Provider<RegularFile>> artifactPathStrategy = artifact -> artifactsBuildDir.map(dir -> dir.file(artifactNamingStrategy.getFilename(artifact)));
155-
156160
task.getIncludeNeoForgeInGameJar().set(versionCapabilities.needsNeoForgeInMinecraftJar());
157161
task.getGameJarArtifact().set(artifactPathStrategy.apply(WorkflowArtifact.COMPILED));
158162
if (disableRecompilation) {
@@ -185,6 +189,27 @@ public static ModDevArtifactsWorkflow create(Project project,
185189
task.getNeoFormArtifact().set(moddingDependencies.neoFormDependencyNotation());
186190
});
187191

192+
var splitMergedJar = tasks.register("splitMergedJar", SplitMergedJar.class, task -> {
193+
if (!splitDist){
194+
throw new IllegalStateException("Can't request split dist result when splitDist is disabled!");
195+
}
196+
task.getClientResourcesJar().set(createArtifacts.flatMap(CreateMinecraftArtifacts::getResourcesArtifact));
197+
task.getClientJar().set(artifactPathStrategy.apply(WorkflowArtifact.CLIENT));
198+
task.getCommonJar().set(artifactPathStrategy.apply(WorkflowArtifact.COMMON));
199+
if (!disableRecompilation) {
200+
task.getMergedJar().set(createArtifacts.flatMap(CreateMinecraftArtifacts::getGameJarWithSourcesArtifact));
201+
task.getClientSourcesJar().set(artifactPathStrategy.apply(WorkflowArtifact.CLIENT_SOURCES));
202+
task.getCommonSourcesJar().set(artifactPathStrategy.apply(WorkflowArtifact.COMMON_SOURCES));
203+
} else {
204+
task.getMergedJar().set(createArtifacts.flatMap(CreateMinecraftArtifacts::getGameJarArtifact));
205+
}
206+
207+
});
208+
209+
if(splitDist){
210+
ideIntegration.runTaskOnProjectSync(splitMergedJar);
211+
}
212+
188213
// For IntelliJ, we attach a combined sources+classes artifact which enables an "Attach Sources..." link for IJ users
189214
// Otherwise, attaching sources is a pain for IJ users.
190215
Provider<? extends Dependency> minecraftClassesDependency;
@@ -218,13 +243,26 @@ public static ModDevArtifactsWorkflow create(Project project,
218243
config.setDescription("The compile-time dependencies to develop a mod, including Minecraft and modding platform classes.");
219244
config.setCanBeResolved(false);
220245
config.setCanBeConsumed(false);
221-
config.getDependencies().addLater(minecraftClassesDependency);
246+
if (!splitDist){
247+
config.getDependencies().addLater(minecraftClassesDependency);
248+
} else {
249+
config.getDependencies().addLater(splitMergedJar.map(task -> project.files(task.getCommonJar())).map(dependencyFactory::create));
250+
}
222251
config.getDependencies().add(moddingDependencies.gameLibrariesDependency());
223252
if (!versionCapabilities.needsNeoForgeInMinecraftJar() && moddingDependencies.neoForgeDependency() != null) {
224253
config.getDependencies().add(moddingDependencies.neoForgeDependency());
225254
}
226255
});
227256

257+
var clientExtraCompileDependencies = configurations.create("modDevClientCompileDependencies", config -> {
258+
config.setDescription("The extra client compile-time dependencies to develop a mod, including Minecraft and modding platform classes.");
259+
config.setCanBeResolved(false);
260+
config.setCanBeConsumed(false);
261+
if (splitDist){
262+
config.getDependencies().addLater(splitMergedJar.map(task -> project.files(task.getClientJar())).map(dependencyFactory::create));
263+
}
264+
});
265+
228266
// For IDEs that support it, link the source/binary artifacts if we use separated ones
229267
if (!disableRecompilation && !ideIntegration.shouldUseCombinedSourcesAndClassesArtifact()) {
230268
ideIntegration.attachSources(
@@ -242,13 +280,22 @@ public static ModDevArtifactsWorkflow create(Project project,
242280
downloadAssets,
243281
runtimeDependencies,
244282
compileDependencies,
283+
clientExtraCompileDependencies,
245284
modDevBuildDir,
246285
artifactsBuildDir);
247286

248287
project.getExtensions().add(ModDevArtifactsWorkflow.class, EXTENSION_NAME, result);
249288

250289
for (var sourceSets : enabledSourceSets) {
251-
result.addToSourceSet(sourceSets);
290+
result.addToSourceSet(sourceSets, !splitDist);
291+
}
292+
293+
if (splitDist){
294+
SourceSetContainer sourceSets = ExtensionUtils.getSourceSets(project);
295+
var main = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
296+
SourceSet client = sourceSets.create("client");
297+
client.setCompileClasspath(client.getCompileClasspath().plus(main.getOutput()));
298+
result.addToSourceSet(client,true);
252299
}
253300

254301
return result;
@@ -351,14 +398,23 @@ private static List<Configuration> configureArtifactManifestConfigurations(
351398
* Adds the compile-time and runtime-dependencies needed to compile mod code to the source-set of the given name.
352399
*/
353400
public void addToSourceSet(SourceSet sourceSet) {
401+
addToSourceSet(sourceSet, true);
402+
}
403+
404+
public void addToSourceSet(SourceSet sourceSet, boolean includeClient) {
354405
var configurations = project.getConfigurations();
355406
var sourceSets = ExtensionUtils.getSourceSets(project);
356407
if (!sourceSets.contains(sourceSet)) {
357408
throw new GradleException("Cannot add to the source set in another project: " + sourceSet);
358409
}
359410

360-
configurations.getByName(sourceSet.getRuntimeClasspathConfigurationName()).extendsFrom(runtimeDependencies);
361-
configurations.getByName(sourceSet.getCompileClasspathConfigurationName()).extendsFrom(compileDependencies);
411+
Configuration runtime = configurations.getByName(sourceSet.getRuntimeClasspathConfigurationName());
412+
runtime.extendsFrom(runtimeDependencies);
413+
Configuration compile = configurations.getByName(sourceSet.getCompileClasspathConfigurationName());
414+
compile.extendsFrom(compileDependencies);
415+
if (includeClient) {
416+
compile.extendsFrom(clientExtraCompileDependencies);
417+
}
362418
}
363419

364420
public Provider<RegularFile> requestAdditionalMinecraftArtifact(String id, String filename) {

src/main/java/net/neoforged/moddevgradle/internal/ModDevPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public void enable(
9898
configurations.getByName(DataFileCollections.CONFIGURATION_ACCESS_TRANSFORMERS),
9999
configurations.getByName(DataFileCollections.CONFIGURATION_INTERFACE_INJECTION_DATA),
100100
versionCapabilities,
101-
settings.isDisableRecompilation());
101+
settings.isDisableRecompilation(),
102+
settings.isSplitDist());
102103

103104
ModDevRunWorkflow.create(
104105
project,

src/main/java/net/neoforged/moddevgradle/internal/ModDevRunWorkflow.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,8 @@ public static void setupRuns(
272272
if (!versionCapabilities.modLocatorRework()) {
273273
// TODO: do this properly now that we have a flag in the version capabilities
274274
// This will explicitly be replaced in RunUtils to make this work for IDEs
275-
run.getEnvironment().put("MOD_CLASSES", RunUtils.getGradleModFoldersProvider(project, run.getLoadedMods(), null).getClassesArgument());
275+
boolean isClient = run.getType().get().startsWith("client");
276+
run.getEnvironment().put("MOD_CLASSES", RunUtils.getGradleModFoldersProvider(project, run.getLoadedMods(), null, isClient).getClassesArgument());
276277
}
277278
var prepareRunTask = setupRunInGradle(
278279
project,
@@ -405,7 +406,8 @@ private static TaskProvider<PrepareRun> setupRunInGradle(
405406
task.getVmArgsFile().set(prepareRunTask.get().getVmArgsFile().map(d -> d.getAsFile().getAbsolutePath()));
406407
task.getProgramArgsFile().set(prepareRunTask.get().getProgramArgsFile().map(d -> d.getAsFile().getAbsolutePath()));
407408
task.getEnvironment().set(run.getEnvironment());
408-
task.getModFolders().set(RunUtils.getGradleModFoldersProvider(project, run.getLoadedMods(), null));
409+
boolean isClient = run.getType().get().startsWith("client");
410+
task.getModFolders().set(RunUtils.getGradleModFoldersProvider(project, run.getLoadedMods(), null, isClient));
409411
});
410412
createLaunchScriptsTask.configure(task -> task.dependsOn(launchScriptTask));
411413

@@ -428,8 +430,8 @@ private static TaskProvider<PrepareRun> setupRunInGradle(
428430
// Of course we need the arg files to be up-to-date ;)
429431
task.dependsOn(prepareRunTask);
430432
task.dependsOn(run.getTasksBefore());
431-
432-
task.getJvmArgumentProviders().add(RunUtils.getGradleModFoldersProvider(project, run.getLoadedMods(), null));
433+
boolean isClient = run.getType().get().startsWith("client");
434+
task.getJvmArgumentProviders().add(RunUtils.getGradleModFoldersProvider(project, run.getLoadedMods(), null, isClient));
433435
});
434436

435437
return prepareRunTask;
@@ -524,7 +526,7 @@ static void setupTestTask(Project project,
524526
task.systemProperty("fml.junit.argsfile", programArgsFile.get().getAsFile().getAbsolutePath());
525527
task.jvmArgs(RunUtils.getArgFileParameter(vmArgsFile.get()));
526528

527-
var modFoldersProvider = RunUtils.getGradleModFoldersProvider(project, loadedMods, testedMod);
529+
var modFoldersProvider = RunUtils.getGradleModFoldersProvider(project, loadedMods, testedMod, true);
528530
task.getJvmArgumentProviders().add(modFoldersProvider);
529531
});
530532

0 commit comments

Comments
 (0)