Skip to content

Commit 9495847

Browse files
authored
Switch from NeoGradle to MDG (#8125)
1 parent 8745710 commit 9495847

File tree

10 files changed

+133
-120
lines changed

10 files changed

+133
-120
lines changed

.github/workflows/codeql.yml

-17
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,3 @@ jobs:
5353
uses: github/codeql-action/analyze@v3
5454
with:
5555
category: "/language:${{ matrix.language }}"
56-
upload: false # disable the upload here - we will upload in a different action
57-
output: sarif-results
58-
59-
- name: filter-sarif
60-
uses: advanced-security/filter-sarif@v1
61-
with:
62-
# filter out NG generated MC sources
63-
patterns: |
64-
-build/tmp/.cache/**
65-
-build/neoForm/**
66-
input: sarif-results/${{ matrix.language }}.sarif
67-
output: sarif-results/${{ matrix.language }}.sarif
68-
69-
- name: Upload SARIF
70-
uses: github/codeql-action/upload-sarif@v3
71-
with:
72-
sarif_file: sarif-results/${{ matrix.language }}.sarif

.github/workflows/gametests.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ jobs:
4141
run: ./gradlew runGameTestServer
4242

4343
- name: Run Unit Tests with Gradle
44-
run: ./gradlew testJunit
44+
run: ./gradlew test

.github/workflows/gradle-publish.yml

-7
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,6 @@ jobs:
4242
with:
4343
file: gradle.properties
4444
all: true
45-
- name: Cache NG outputs
46-
uses: actions/cache@v4
47-
with:
48-
key: ${{ steps.gradle_props.outputs.minecraft_version }}-${{ steps.gradle_props.outputs.forge_version }}
49-
path: |
50-
build/neoForge
51-
build/neoForm
5245
- name: Validate Gradle Wrapper
5346
uses: gradle/actions/wrapper-validation@v3
5447
- name: Setup Java

build.gradle

+121-73
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ plugins {
2020
id('eclipse')
2121
id('idea')
2222
id('maven-publish')
23-
id('net.neoforged.gradle.userdev') version('7.0.154')//https://projects.neoforged.net/neoforged/neogradle
23+
id('net.neoforged.moddev') version('2.0.75')//https://projects.neoforged.net/neoforged/moddevgradle
2424
}
2525

2626
tasks.named('wrapper', Wrapper) {
@@ -71,7 +71,6 @@ sourceSets {
7171
compileClasspath += api.output
7272
}
7373
gameTest {
74-
runs.modIdentifier = 'mekanismtests'
7574
compileClasspath += api.output
7675
}
7776
}
@@ -96,7 +95,6 @@ setupExtraSourceSets(sourceSets.gameTest, false)
9695
// based on the primary added source set
9796
for (String name : secondaryModules) {
9897
def sourceSet = sourceSets.create(name)
99-
sourceSet.runs.modIdentifier = name
10098
sourceSet.resources {
10199
//Add the generated module resources
102100
srcDirs += ["src/datagen/generated/mekanism${name}"]
@@ -155,11 +153,12 @@ SourceSet setupExtraSourceSet(SourceSet baseSourceSet, String extra) {
155153
extraSourceSet.resources.srcDirs = ["src/${extra}/${name}/resources"]
156154
extraSourceSet.compileClasspath += project.sourceSets.api.output
157155
extraSourceSet.compileClasspath += project.sourceSets.main.output
156+
extraSourceSet.runtimeClasspath += project.sourceSets.main.runtimeClasspath
158157
if (baseSourceSet != project.sourceSets.main) {
159158
//If the base sourceSet is main it already is the extra source set and has a reference to the base one from before this if statement
160159
extraSourceSet.compileClasspath += getExtraSourceSet(project.sourceSets.main, extra).get().output
161160
extraSourceSet.compileClasspath += baseSourceSet.output
162-
extraSourceSet.runs.modIdentifier = name
161+
extraSourceSet.runtimeClasspath += baseSourceSet.runtimeClasspath
163162
}
164163
return extraSourceSet
165164
}
@@ -170,10 +169,6 @@ static void extendConfigurations(Configuration base, Configuration... configurat
170169
}
171170
}
172171

173-
Provider<SourceSet> getExtraSourceSet(String base, String name) {
174-
return project.sourceSets.named(base).flatMap(sourceSet -> getExtraSourceSet(sourceSet, name))
175-
}
176-
177172
Provider<SourceSet> getExtraSourceSet(SourceSet base, String name) {
178173
return project.sourceSets.named(base.getTaskName(name, null))
179174
}
@@ -197,8 +192,8 @@ def setupTasks(SourceSet sourceSet) {
197192
tasks.named(sourceSet.processResourcesTaskName, ProcessResources) {
198193
setGroup('process resources')
199194
duplicatesStrategy = DuplicatesStrategy.FAIL
200-
var versionProperties = ['version': mod_version, 'mc_version': minecraft_version_range, 'forge_version': forge_version_range, 'loader_version': loader_version_range,
201-
'jei_version': jei_version_range]
195+
var versionProperties = ['file' : ['jarVersion': mod_version], 'mc_version': minecraft_version_range, 'forge_version': forge_version_range,
196+
'loader_version': loader_version_range, 'jei_version': jei_version_range]
202197
//Mark the properties as inputs so that when they change things update
203198
inputs.properties(versionProperties)
204199
filesMatching('META-INF/neoforge.mods.toml') { expand(versionProperties) }
@@ -235,76 +230,132 @@ java {
235230
withSourcesJar()
236231
}
237232

238-
minecraft.accessTransformers.files(
239-
file('src/main/resources/META-INF/accesstransformer.cfg'),
240-
file('src/additions/resources/META-INF/accesstransformer.cfg'),
241-
//Dev time only ATs so the file name doesn't have to match accesstransformer.cfg
242-
file('src/datagen/main/resources/META-INF/datagen_ats.cfg'),
243-
file('src/gameTest/resources/META-INF/gametest_ats.cfg')
244-
)
245-
246-
runs {
247-
configureEach {
248-
if (hasProperty('forge_force_ansi')) {
249-
//Force ansi if declared as a gradle variable, as the auto detection doesn't detect IntelliJ properly
250-
// or eclipse's plugin that adds support for ansi escape in console
251-
systemProperties.put('terminal.ansi', (String) property('forge_force_ansi'))
252-
}
233+
final runsFolder = layout.projectDirectory.dir('runs')
234+
final clientRunsFolder = runsFolder.dir('client')
253235

254-
modSources.add((SourceSet[]) [sourceSets.main, sourceSets.api])
236+
neoForge {
237+
// This enables modding tasks and configurations
238+
enable {
239+
version = forge_version
240+
enabledSourceSets = sourceSets // All source sets use Minecraft code
241+
}
255242

256-
for (String name : secondaryModules) {
257-
modSources.add((SourceSet) sourceSets.named(name).get())
243+
mods {
244+
mekanism {
245+
sourceSet((SourceSet) sourceSets.api)
246+
sourceSet((SourceSet) sourceSets.main)
258247
}
259-
260-
//if the selected toolchain is a JBR, enable DCEVM
261-
if (javaToolchains.launcherFor(java.toolchain).map { it.metadata.vendor }.getOrElse('').contains('JetBrains')) {
262-
jvmArguments.add('-XX:+AllowEnhancedClassRedefinition')
248+
// contains main mod + its datagen code
249+
mekanismData {
250+
modSourceSets = mods.mekanism.modSourceSets
251+
sourceSet((SourceSet) sourceSets.datagenMain)
263252
}
264-
}
265-
//Note: To enable logging into the client account, set the neogradle.subsystems.devLogin.conventionForRun property to true in your gradle user home
266-
// https://github.com/neoforged/NeoGradle?tab=readme-ov-file#per-run-configuration
267-
client {
268-
}
269-
clientAlt {
270-
configure('client')
271-
//Force disable devLogin for clientAlt regardless of if it is enabled via gradle properties for the main gradle run
272-
devLogin.enabled(false)
273-
if (!(findProperty('neogradle.subsystems.devLogin.conventionForRun') ?: false)) {
274-
//If the property is missing or set to false (so the normal runClient task would use Dev as the name),
275-
// change the name of the alt client type so that it doesn't conflict with the main dev one
276-
programArguments.addAll((String[]) ['--username', 'AltDev'])
253+
mekanismtests {
254+
sourceSet((SourceSet) sourceSets.gameTest)
277255
}
278256
}
279-
server {
280-
}
281-
gameTestServer {
282-
modSources.add((SourceSet) sourceSets.gameTest)
283-
}
284-
gameTestClient {
285-
configure('client')
286-
modSources.add((SourceSet) sourceSets.gameTest)
287-
}
288-
junit {
289-
unitTestSources.add((SourceSet) sourceSets.test)
290-
}
291-
data {
292-
programArguments.addAll((String[]) ['--all', '--output', file('src/datagen/generated/').absolutePath,
293-
'--mod', 'mekanism', '--existing', file('src/main/resources/').absolutePath])
257+
for (String name : secondaryModules) {
258+
final sourceSet = sourceSets.named(name)
259+
mods.maybeCreate(name).modSourceSets.add(sourceSet)
260+
// Create a secondary mod group for the modules main code + its datagen code
261+
final datagenMod = mods.maybeCreate(name + 'Data')
262+
datagenMod.modSourceSets.add(sourceSet)
263+
datagenMod.modSourceSets.add(sourceSet.flatMap(s -> getExtraSourceSet(s, 'datagen')))
264+
}
265+
266+
accessTransformers = [
267+
'src/main/resources/META-INF/accesstransformer.cfg',
268+
'src/additions/resources/META-INF/accesstransformer.cfg',
269+
//Dev time only ATs so the file name doesn't have to match accesstransformer.cfg
270+
'src/datagen/main/resources/META-INF/datagen_ats.cfg',
271+
'src/gameTest/resources/META-INF/gametest_ats.cfg',
272+
]
294273

295-
modSources.add((SourceSet) sourceSets.datagenMain)
274+
runs {
275+
configureEach {
276+
if (hasProperty('forge_force_ansi')) {
277+
//Force ansi if declared as a gradle variable, as the auto detection doesn't detect IntelliJ properly
278+
// or eclipse's plugin that adds support for ansi escape in console
279+
systemProperties.put('terminal.ansi', (String) property('forge_force_ansi'))
280+
}
296281

297-
for (String name : secondaryModules) {
298-
modSources.add(getExtraSourceSet(name, 'datagen').get())
299-
programArguments.addAll((String[]) ['--mod', "mekanism${name}", '--existing', file("src/${name}/resources/").absolutePath])
300-
}
282+
loadedMods = [mods.mekanism]
283+
for (String name : secondaryModules) {
284+
loadedMods.add(mods.named(name))
285+
}
286+
//if the selected toolchain is a JBR, enable DCEVM
287+
if (javaToolchains.launcherFor(java.toolchain).map { it.metadata.vendor }.getOrElse('').contains('JetBrains')) {
288+
jvmArguments.addAll('-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition')
289+
}
301290

302-
dependencies {
303-
runtime(configurations.datagenNonMod)
291+
// Uncomment this to get verbose debug logging
292+
// logLevel = org.slf4j.event.Level.DEBUG
293+
}
294+
//Note: To enable logging into the client account, set the mc_devlogin property to true in your gradle user home
295+
// You can also run gradlew runClient -Pmc_devlogin=true
296+
client {
297+
client()
298+
gameDirectory.value(clientRunsFolder)
299+
if (findProperty('mc_devlogin') ?: false) {
300+
devLogin = true
301+
}
302+
}
303+
clientAlt {
304+
client()
305+
gameDirectory.value(runsFolder.dir('clientAlt'))
306+
// Force dev login to be disabled for this run to allow using a secondary username
307+
devLogin = false
308+
programArguments.addAll('--username', 'AltDev')
309+
}
310+
server {
311+
server()
312+
gameDirectory.value(runsFolder.dir('server'))
313+
}
314+
gameTestServer {
315+
type = 'gameTestServer'
316+
gameDirectory.value(runsFolder.dir('gameTestServer'))
317+
sourceSet = sourceSets.gameTest
318+
loadedMods.add(mods.mekanismtests)
319+
}
320+
gameTestClient {
321+
client()
322+
gameDirectory.value(clientRunsFolder)
323+
if (findProperty('mc_devlogin') ?: false) {
324+
devLogin = true
325+
}
326+
sourceSet = sourceSets.gameTest
327+
loadedMods.add(mods.mekanismtests)
328+
programArguments.addAll('--quickPlaySingleplayer', 'GameTestWorld')
304329
}
330+
data {
331+
data()
332+
gameDirectory.value(runsFolder.dir('data'))
333+
programArguments.addAll('--all', '--output', file('src/datagen/generated/').absolutePath,
334+
'--mod', 'mekanism', '--existing', file('src/main/resources/').absolutePath)
335+
336+
sourceSet = sourceSets.datagenMain
337+
loadedMods = [mods.mekanismData]
338+
339+
for (String name : secondaryModules) {
340+
//println("Adding $name")
341+
loadedMods.add(mods.named(name + 'Data'))
342+
programArguments.addAll('--mod', 'mekanism' + name, '--existing', file("src/${name}/resources/").absolutePath)
343+
}
344+
}
345+
}
346+
347+
unitTest {
348+
enable()
349+
testedMod = mods.mekanism
350+
loadedMods = runs.client.loadedMods
305351
}
306352
}
307353

354+
// Ensure any jar without the necessary FML manifest attributes gets picked up via legacy classpath.
355+
// This configuration only exists after setting the neoForge version above.
356+
//TODO: Remove all this datagenNonMod stuff once we add FMLModType to yaml-ops
357+
configurations.dataAdditionalRuntimeClasspath.extendsFrom configurations.datagenNonMod
358+
308359
static void exclusiveRepo(RepositoryHandler handler, String url, String... groups) {
309360
exclusiveRepo(handler, url, filter -> {
310361
for (def group : groups) {
@@ -341,14 +392,11 @@ repositories { RepositoryHandler handler ->
341392
exclusiveRepo(handler, 'https://maven.parchmentmc.org/', 'org.parchmentmc.data')
342393
}
343394

344-
tasks.named('test') {
345-
//Disable builtin test task as we use and build uses testJunit so there is no point in having it also attempt to run an empty test task
346-
enabled = false
395+
tasks.named('test', Test) {
396+
useJUnitPlatform()
347397
}
348398

349399
dependencies {
350-
implementation("net.neoforged:neoforge:${forge_version}")
351-
352400
compileOnly(project(':annotation-processor'))
353401
localRuntime(project(':annotation-processor'))
354402
annotationProcessor(project(':annotation-processor'))
@@ -360,7 +408,7 @@ dependencies {
360408
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junit_version}")
361409
//We use https://github.com/jqwik-team/jqwik to allow for implementing property based testing
362410
testImplementation("net.jqwik:jqwik:${jqwik_version}")
363-
411+
364412
compileOnly("mezz.jei:jei-${minecraft_version}-neoforge-api:${jei_version}")
365413
if (recipe_viewer == 'jei' || recipe_viewer == 'hybrid') {
366414
localRuntime("mezz.jei:jei-${minecraft_version}-neoforge:${jei_version}")

gradle.properties

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
22
# This is required to provide enough memory for the Minecraft decompilation process.
3-
org.gradle.jvmargs=-Xmx4G
43
org.gradle.configuration-cache=true
54

65
java_version=21
@@ -23,10 +22,9 @@ release_type=alpha
2322
junit_version=5.11.0
2423
jqwik_version=1.9.0
2524

26-
#NeoGradle Settings
27-
neogradle.subsystems.parchment.minecraftVersion=1.21.1
28-
neogradle.subsystems.parchment.mappingsVersion=2024.11.17
29-
neogradle.subsystems.conventions.sourcesets.enabled=false
25+
#Parchment Settings
26+
neoForge.parchment.minecraftVersion=1.21.1
27+
neoForge.parchment.mappingsVersion=2024.11.17
3028

3129
#misc settings
3230
# recipe viewer, currently accepts: jei, emi, hybrid

settings.gradle

+1-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
1-
pluginManagement {
2-
repositories {
3-
gradlePluginPortal()
4-
maven {
5-
name = "NeoForge"
6-
url = "https://maven.neoforged.net/releases/"
7-
}
8-
}
9-
}
101

112
plugins {
123
id('org.gradle.toolchains.foojay-resolver-convention') version('0.9.0')
134
}
145

15-
include('annotation-processor')
6+
include('annotation-processor')

src/additions/resources/META-INF/neoforge.mods.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ license="MIT"
55

66
[[mods]]
77
modId="mekanismadditions"
8-
version="${version}"
8+
version="${file.jarVersion}"
99
displayName="Mekanism: Additions"
1010
displayURL="https://aidancbrady.com/mekanism/"
1111
authors="Aidancbrady, Thommy101, Thiakil, pupnewfster, dizzyd"
@@ -16,6 +16,6 @@ license="MIT"
1616
[[dependencies.mekanismadditions]]
1717
modId="mekanism"
1818
type="required"
19-
versionRange="[${version}]"
19+
versionRange="[${file.jarVersion}]"
2020
ordering="AFTER"
2121
side="BOTH"

src/generators/resources/META-INF/neoforge.mods.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ license="MIT"
55

66
[[mods]]
77
modId="mekanismgenerators"
8-
version="${version}"
8+
version="${file.jarVersion}"
99
displayName="Mekanism: Generators"
1010
displayURL="https://aidancbrady.com/mekanism/"
1111
authors="Aidancbrady, Thommy101, Thiakil, pupnewfster, dizzyd"
@@ -16,6 +16,6 @@ license="MIT"
1616
[[dependencies.mekanismgenerators]]
1717
modId="mekanism"
1818
type="required"
19-
versionRange="[${version}]"
19+
versionRange="[${file.jarVersion}]"
2020
ordering="AFTER"
2121
side="BOTH"

0 commit comments

Comments
 (0)