mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-08 14:44:48 +00:00
This introduces two new artifacts forge-examiner: A new mod locator that allows for a single directory to be split into multiple modules forge-tests: Our test mods, showing examples of data gen, game tests, and various Forge features Adds a new system useful for projects with multiple sub-projects that use datagen
590 lines
21 KiB
Groovy
590 lines
21 KiB
Groovy
import org.apache.tools.ant.filters.ReplaceTokens
|
|
|
|
plugins {
|
|
id 'eclipse'
|
|
alias libs.plugins.versions
|
|
alias libs.plugins.jarsigner
|
|
alias libs.plugins.forgedev
|
|
id 'net.minecraftforge.forge.build.convention'
|
|
}
|
|
|
|
gradleutils.displayName = 'Forge'
|
|
description = 'Modifications to Minecraft to enable mod developers.'
|
|
|
|
jarSigner.autoDetect('forge')
|
|
|
|
// We have to tell ForgeDev to use the exact versions of tools we ship in the installer
|
|
fdtools {
|
|
configure('binpatcher') {
|
|
version = buildLibs.binarypatcher.get().version
|
|
}
|
|
configure('installertools') {
|
|
version = buildLibs.installertools.get().version
|
|
}
|
|
configure('jarcompatibilitychecker') {
|
|
javaLauncher = javaToolchains.launcherFor(java.toolchain)
|
|
}
|
|
}
|
|
|
|
/* This is used for debugging, comparing all published artifacts against actual production
|
|
forgedev.validatePublish {
|
|
task {
|
|
baseBranch = 'upstream/26.1.2'
|
|
versionPrefix = versions.minecraft
|
|
}
|
|
}
|
|
*/
|
|
|
|
final minecraftFiles = forgedev.minecraftFiles(versions.minecraft)
|
|
|
|
final mcpBase = forgedev.mcpBase {
|
|
mcpVersion = "${versions.minecraft}-${versions.mcp}"
|
|
accessTransformers.from file('src/main/resources/META-INF/accesstransformer.cfg')
|
|
sideAnnotationStrippers.from file('src/main/resources/forge.sas')
|
|
}
|
|
forgedev.provideFile('metadata', mcpBase.metadata)
|
|
|
|
forgedev.patches {
|
|
base = mcpBase
|
|
patches = file('patches/minecraft')
|
|
patched = file('src/minecraft/java')
|
|
sourceSets.main.java.srcDir patched
|
|
}
|
|
|
|
tasks.register('setup') {
|
|
dependsOn forgedev.patches.apply
|
|
}
|
|
|
|
license {
|
|
include 'net/minecraftforge/'
|
|
exclude 'net/minecraftforge/common/LenientUnboundedMapCodec.java'
|
|
}
|
|
|
|
changelog {
|
|
publishAll = false
|
|
}
|
|
|
|
// TODO [ForgeDev] Support compileOnlyApi, runtimeOnly, and a consumable annotation processor configuration
|
|
configurations {
|
|
// Don't pull all libraries, if we're missing something, add it to the installer list so the installer knows to download it.
|
|
register('bootstrap') {
|
|
transitive = false
|
|
canBeDeclared = true
|
|
canBeResolved = true
|
|
}
|
|
|
|
register('installer') {
|
|
transitive = false
|
|
canBeDeclared = true
|
|
canBeResolved = true
|
|
extendsFrom(bootstrap)
|
|
}
|
|
|
|
named('api') {
|
|
extendsFrom(installer)
|
|
// Inherit vanilla Minecraft's dependencies, and let downstream access them
|
|
extendsFrom(mcpBase.dependencyConfiguration)
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
// These need to actually be on the classpath at the start. This is only used for the server shim jar.
|
|
// And this is only needed because custom file systems are REQUIRED to be on the boot classloader.
|
|
// This has ASM/BootStrap/Unsafe all because I haven't gotten around to moving UnionFileSystem out to its own project.
|
|
bootstrap libs.jarjar.fs // JarInJar file system
|
|
bootstrap libs.roimfs // JarInJar File System - FileSystems need to be on boot loader.
|
|
bootstrap libs.bundles.jimfs // In memory file system used for ForgeDev launches
|
|
bootstrap libs.securemodules // Has Union file system in it
|
|
bootstrap libs.unsafe // Needed by securemodules
|
|
bootstrap libs.bundles.asm // Needed by securemodules
|
|
|
|
implementation libs.jopt.simple
|
|
|
|
installer libs.bootstrap
|
|
installer libs.bootstrap.api // Needed by securemodules
|
|
installer libs.accesstransformers
|
|
installer libs.eventbus
|
|
installer libs.jspecify // Dep of EventBus
|
|
installer libs.forgespi
|
|
installer libs.coremods.api
|
|
installer libs.modlauncher
|
|
installer libs.mergetool.api
|
|
installer libs.bundles.night.config
|
|
installer libs.maven.artifact
|
|
installer libs.bundles.terminalconsoleappender
|
|
installer libs.mixin
|
|
installer libs.mixinextras.forge
|
|
installer libs.bundles.jarjar
|
|
installer libs.roimfs
|
|
|
|
installer projects.fmlcore
|
|
installer projects.fmlloader
|
|
installer projects.fmlearlydisplay
|
|
installer projects.javafmllanguage
|
|
installer projects.lowcodelanguage
|
|
installer projects.mclanguage
|
|
installer projects.forgeTransformers
|
|
|
|
runtimeOnly files(mcpBase.extra)
|
|
|
|
runtimeOnly libs.bootstrap
|
|
runtimeOnly libs.bootstrap.dev
|
|
|
|
annotationProcessor libs.eventbus.validator
|
|
}
|
|
|
|
convention.basicRuns('forge', file('src/main/generated/'))
|
|
|
|
final EXTRA_TXTS = [
|
|
file('LICENSE.txt'),
|
|
changelog.task.flatMap(task -> task.outputFile)
|
|
]
|
|
|
|
final serverShim = forgedev.shim {
|
|
config {
|
|
mainClass = 'net.minecraftforge.bootstrap.ForgeBootstrap'
|
|
args = ['--launchTarget', 'forge_server']
|
|
}
|
|
classpath {
|
|
libraries configurations.installer
|
|
library tasks.named('universalJar', Jar)
|
|
library forgedev.binaryPatches('server').apply, 'server'
|
|
serverBundle.fileProvider(minecraftFiles.server)
|
|
}
|
|
bootstrapClasspath(configurations.bootstrap)
|
|
jar {
|
|
jarSigner.sign(it)
|
|
}
|
|
}
|
|
|
|
final finalizeSpawn = forgedev.methodCallFinder('findFinalizeSpawnTargets') {
|
|
jar.fileProvider(mcpBase.classes)
|
|
output = rootProject.file('forge-transformers/src/main/resources/coremods/finalize_spawn_targets.json')
|
|
blacklist 'net/minecraft/world/level/BaseSpawner' // Ignore this class as we special case it.
|
|
invokeVirtual('finalizeSpawn', '(Lnet/minecraft/world/level/ServerLevelAccessor;Lnet/minecraft/world/DifficultyInstance;Lnet/minecraft/world/entity/EntitySpawnReason;Lnet/minecraft/world/entity/SpawnGroupData;)Lnet/minecraft/world/entity/SpawnGroupData;')
|
|
}
|
|
|
|
forgedev.validateDeprecations(tasks.named('jar', Jar)) {
|
|
mcVersion = versions.minecraft
|
|
}
|
|
|
|
forgedev.checks() {
|
|
base = mcpBase
|
|
ats {}
|
|
sas {}
|
|
execs {}
|
|
|
|
patches {
|
|
dependsOn forgedev.patches.make
|
|
patchDir = forgedev.patches.patches
|
|
patchesWithS2SArtifact = [
|
|
'minecraft/net/minecraft/client/renderer/ViewArea.java.patch',
|
|
'minecraft/net/minecraft/data/models/blockstates/Variant.java.patch',
|
|
]
|
|
}
|
|
|
|
fix {
|
|
dependsOn finalizeSpawn
|
|
}
|
|
|
|
forgedev.patches.make.configure {
|
|
finalizedBy forgedev.checks.patches.fix
|
|
}
|
|
}
|
|
|
|
final crowdin = forgedev.crowdin // Create the crowdin tasks
|
|
tasks.named('jar', Jar) {
|
|
from(EXTRA_TXTS)
|
|
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
|
exclude '.cache'
|
|
|
|
from(zipTree(crowdin.flatMap { it.output } )) {
|
|
include 'assets/forge/lang/*.json'
|
|
}
|
|
|
|
manifest {
|
|
attributes([
|
|
'Automatic-Module-Name': 'net.minecraftforge.forge'
|
|
])
|
|
gradleutils.manifestDefaults(it, 'net/minecraftforge/versions/forge/')
|
|
gradleutils.manifestDefaults(it, 'net/minecraftforge/versions/mcp/', [
|
|
'Specification-Title' : 'Minecraft',
|
|
'Specification-Version' : versions.minecraft,
|
|
'Implementation-Title' : 'MCP',
|
|
'Implementation-Version': versions.mcp
|
|
])
|
|
}
|
|
jarSigner.sign(it)
|
|
}
|
|
|
|
final universalJar = tasks.register('universalJar', Jar) {
|
|
from (zipTree(tasks.named('jar', Jar).flatMap { it.archiveFile } )) {
|
|
exclude(forgedev.filterVanilla(mcpBase.classes))
|
|
}
|
|
manifest = tasks.named('jar', Jar).get().manifest
|
|
archiveClassifier = 'universal'
|
|
jarSigner.sign(it)
|
|
}
|
|
|
|
final sourcesJarAll = tasks.register('sourcesJarAll', Jar) {
|
|
archiveClassifier = 'sources-all'
|
|
from(sourceSets.main.allJava.srcDirs)
|
|
}
|
|
|
|
// Our sources, plus the patches we do to Vanilla Minecraft
|
|
final sourcesJar = tasks.register('sourcesJar', Jar) {
|
|
archiveClassifier = 'sources'
|
|
from(sourceSets.main.allJava.srcDirs - forgedev.patches.patched.asFile.get())
|
|
mustRunAfter(forgedev.patches.make)
|
|
from(forgedev.patches.patches) {
|
|
into 'patches/'
|
|
}
|
|
}
|
|
|
|
forgedev.userDev {
|
|
base(mcpBase)
|
|
|
|
config {
|
|
universal universalJar
|
|
sources sourcesJar
|
|
addLibraries(configurations.installer)
|
|
// TODO [ForgeDev][UserDev] Split API/Runtime elements in userdev config
|
|
// so we don't gotta keep making exceptions for MixinExtras
|
|
addCompileDependency(libs.mixinextras.common)
|
|
addAnnotationProcessorDependency(libs.mixinextras.common)
|
|
|
|
// TODO [ForgeDev] Consolidate Patcher + UserDev Config runs in a sane way
|
|
runs {
|
|
configureEach {
|
|
parents = []
|
|
main = 'net.minecraftforge.bootstrap.ForgeBootstrap'
|
|
args '--gameDir', '.'
|
|
jvmArgs '-Djava.net.preferIPv6Addresses=system', '-XX:+UseCompactObjectHeaders', '-XX:StackShadowPages=32'
|
|
client = it.name.containsIgnoreCase('client')
|
|
environment 'MCP_MAPPINGS', '{mcp_mappings}'
|
|
}
|
|
|
|
register('clientData') {
|
|
args '--launchTarget', "forge_userdev_client_data"
|
|
args '--assetIndex', '{asset_index}'
|
|
args '--assetsDir', '{assets_root}'
|
|
}
|
|
|
|
register('client') {
|
|
property 'forge.enableGameTest', 'true'
|
|
args '--launchTarget', "forge_userdev_client"
|
|
args '--version', 'MOD_DEV'
|
|
args '--assetIndex', '{asset_index}'
|
|
args '--assetsDir', '{assets_root}'
|
|
}
|
|
|
|
register('server') {
|
|
property 'forge.enableGameTest', 'true'
|
|
args '--launchTarget', "forge_userdev_server"
|
|
}
|
|
|
|
register('gameTestServer') {
|
|
args '--launchTarget', "forge_userdev_server_gametest"
|
|
}
|
|
|
|
register('data') {
|
|
args '--launchTarget', "forge_userdev_data"
|
|
args '--assetIndex', '{asset_index}'
|
|
args '--assetsDir', '{assets_root}'
|
|
}
|
|
}
|
|
}
|
|
patches {
|
|
modified.setFrom(sourcesJarAll.flatMap { it.archiveFile })
|
|
}
|
|
binaryPatches {
|
|
mustRunAfter(forgedev.patches.make)
|
|
patches.setFrom(forgedev.patches.patches)
|
|
dirty.setFrom(tasks.named('jar', Jar).flatMap { it.archiveFile })
|
|
}
|
|
}
|
|
|
|
forgedev.userdevCompatibility(versions.minecraft) {
|
|
clean = mcpBase.classes
|
|
dirty = tasks.named('jar', Jar)
|
|
}
|
|
|
|
// region Installer tasks, Not needed when we simplify the installer/remove obf
|
|
final clientBinPatches = forgedev.binaryPatches('client') {
|
|
clean = minecraftFiles.client
|
|
// Workaround for 3rd party launcher issues, marker needed to locate MC, store needed to fix zlib-ng issues
|
|
apply {
|
|
store = true
|
|
marker = '.forge_patched_minecraft'
|
|
}
|
|
}
|
|
final serverBinPatches = forgedev.binaryPatches('server') {
|
|
clean = minecraftFiles.serverExtracted
|
|
apply { store = true }
|
|
}
|
|
// endregion
|
|
|
|
forgedev.installer {
|
|
dev = !forgedev.ci
|
|
offline = false
|
|
baseVersion = buildLibs.installer.get().version.toString()
|
|
|
|
// Add extra libraries
|
|
pack serverShim.jar // The Server executable jar IS needed to be packed, as the installer would need a spec bump in order to download it
|
|
pack universalJar // I don't think this is strictly needed to be packed anymore, will need to double check later
|
|
|
|
launcherLibrary universalJar
|
|
// We configure the launcher here to keep the order for easier diff, after publishing, move this to the LauncherJson configuration below
|
|
launcherJson {
|
|
// We create this during install, so it's not downloadable
|
|
generated(clientBinPatches.apply, 'client')
|
|
}
|
|
|
|
launcherLibraries configurations.installer
|
|
|
|
final launcherId = "${versions.minecraft}-${project.name}-${versions.forge}"
|
|
final installertools = tool(buildLibs.installertools)
|
|
final binarypatcher = tool(buildLibs.binarypatcher)
|
|
|
|
jar {
|
|
from(EXTRA_TXTS)
|
|
from(rootProject.file('/forge_installer_logo.png')) {
|
|
rename { 'big_logo.png' }
|
|
}
|
|
from(clientBinPatches.create.flatMap { t -> t.output }) {
|
|
rename { 'data/client.lzma' }
|
|
}
|
|
from(serverBinPatches.create.flatMap { t -> t.output }) {
|
|
rename { 'data/server.lzma' }
|
|
}
|
|
|
|
final argsFile = rootProject.file('server_files/args.txt')
|
|
final tokens = [tokens: [
|
|
SHIM_JAR_FILE: serverShim.jar.get().archiveFileName.get(),
|
|
MAVEN_PATH: forgedev.mavenArtifact.directory
|
|
]]
|
|
from(argsFile) {
|
|
filter(tokens, ReplaceTokens)
|
|
into 'data'
|
|
rename { 'unix_args.txt' }
|
|
}
|
|
from(argsFile) {
|
|
filter(tokens, ReplaceTokens)
|
|
into 'data'
|
|
rename { 'win_args.txt' }
|
|
}
|
|
|
|
from(rootProject.file('server_files')) {
|
|
filter(tokens, ReplaceTokens)
|
|
into 'data'
|
|
exclude 'args.txt'
|
|
}
|
|
|
|
jarSigner.sign(it)
|
|
}
|
|
json {
|
|
icon = rootProject.file('icon.ico')
|
|
executable serverShim.jar
|
|
minecraft = versions.minecraft
|
|
profileVersion = launcherId
|
|
|
|
final projectArtifact = "${project.group}:${project.name}:${project.version}"
|
|
|
|
data 'MC_UNPACKED', "[net.minecraft:client:${versions.minecraft}]", "[net.minecraft:server:${versions.minecraft}:unpacked]"
|
|
data 'MC_UNPACKED_SHA', minecraftFiles.client, minecraftFiles.serverExtracted
|
|
|
|
data 'BINPATCH', '/data/client.lzma', '/data/server.lzma'
|
|
data 'PATCHED', "[$projectArtifact:client]", "[$projectArtifact:server]"
|
|
data 'PATCHED_SHA', clientBinPatches.apply.flatMap { it.output }, serverBinPatches.apply.flatMap { it.output }
|
|
|
|
steps = [
|
|
extract(installertools) {
|
|
side = 'server'
|
|
archive '{INSTALLER}'
|
|
extract 'data/README.txt', '{ROOT}/README.txt'
|
|
extract 'data/run.sh', '{ROOT}/run.sh'
|
|
executable '{ROOT}/run.sh'
|
|
extract 'data/run.bat', '{ROOT}/run.bat'
|
|
optional 'data/user_jvm_args.txt', '{ROOT}/user_jvm_args.txt'
|
|
extract 'data/unix_args.txt', "{ROOT}/libraries/${forgedev.mavenArtifact.directory}/unix_args.txt"
|
|
extract 'data/win_args.txt', "{ROOT}/libraries/${forgedev.mavenArtifact.directory}/win_args.txt"
|
|
},
|
|
extractBundle(installertools) {
|
|
side = 'server'
|
|
libraries()
|
|
},
|
|
extractBundle(installertools) {
|
|
side = 'server'
|
|
jar '{MINECRAFT_JAR}', '{MC_UNPACKED}'
|
|
cache '{MC_UNPACKED}', '{MC_UNPACKED_SHA}'
|
|
},
|
|
step(binarypatcher) {
|
|
side = 'server'
|
|
args = [
|
|
'--clean', '{MC_UNPACKED}',
|
|
'--output', '{PATCHED}',
|
|
'--apply', '{BINPATCH}',
|
|
'--data', '--unpatched',
|
|
'--store'
|
|
]
|
|
cache '{PATCHED}', '{PATCHED_SHA}'
|
|
},
|
|
step(binarypatcher) {
|
|
side = 'client'
|
|
args = [
|
|
'--clean', '{MINECRAFT_JAR}',
|
|
'--output', '{PATCHED}',
|
|
'--apply', '{BINPATCH}',
|
|
'--data', '--unpatched',
|
|
'--store',
|
|
'--marker', '.forge_patched_minecraft'
|
|
]
|
|
cache '{PATCHED}', '{PATCHED_SHA}'
|
|
}
|
|
]
|
|
}
|
|
|
|
launcherJson {
|
|
// These are flags to preserve glitchy old behavior to make diffing easier, removing when migrating to production is recommended
|
|
sortLibraries = false // Don't sort, makes things non-deterministic, but easier to diff old versions
|
|
duplicateLibraries = true // Our 'bootstrap' layer go added twice
|
|
librariesLast = false // Makes libraries be added before args
|
|
|
|
id = launcherId
|
|
inheritsFrom = versions.minecraft
|
|
mainClass = 'net.minecraftforge.bootstrap.ForgeBootstrap'
|
|
gameArgs = [ '--launchTarget', 'forge_client' ]
|
|
jvmArgs = [ '-Djava.net.preferIPv6Addresses=system', '-XX:+UseCompactObjectHeaders', '-XX:StackShadowPages=32' ]
|
|
}
|
|
}
|
|
|
|
/*
|
|
tasks.named('javadoc', Javadoc) {
|
|
description = 'Generates the combined javadocs for the FML projects and the main Forge project'
|
|
var includedProjects = [ ':fmlcore', ':fmlloader', ':javafmllanguage', ':mclanguage', ':forge-transformers' ]
|
|
source includedProjects.collect { project(it).sourceSets.main.allJava }
|
|
classpath = classpath + files(includedProjects.collect { project(it).sourceSets.main.compileClasspath })
|
|
|
|
var docsDir = rootProject.file('src/docs/')
|
|
inputs.dir(docsDir)
|
|
.withPropertyName('docs resources directory')
|
|
.withPathSensitivity(PathSensitivity.RELATIVE)
|
|
.optional()
|
|
|
|
failOnError = false
|
|
|
|
// Exclude the Minecraft classes if not enabled
|
|
if (!project.hasProperty('generateAllDocumentation')) {
|
|
exclude 'net/minecraft/**'
|
|
exclude 'com/mojang/**'
|
|
}
|
|
exclude 'mcp/**'
|
|
|
|
options {
|
|
stylesheetFile = new File(docsDir, 'stylesheet.css')
|
|
|
|
tags = [
|
|
'apiNote:a:<em>API Note:</em>',
|
|
'implSpec:a:<em>Implementation Requirements:</em>',
|
|
'implNote:a:<em>Implementation Note:</em>'
|
|
]
|
|
|
|
groups = [
|
|
'Forge Mod Loader': [
|
|
'net.minecraftforge.fml.common.asm*',
|
|
'net.minecraftforge.fml.loading*',
|
|
'net.minecraftforge.fml.server*'
|
|
],
|
|
'FML Core': [
|
|
'net.minecraftforge.fml',
|
|
'net.minecraftforge.fml.config*',
|
|
'net.minecraftforge.fml.event*',
|
|
'net.minecraftforge.fml.util*'
|
|
],
|
|
'FML Common': [
|
|
'net.minecraftforge.fml.core',
|
|
'net.minecraftforge.fml.event.config',
|
|
'net.minecraftforge.fml.event.lifecycle'
|
|
],
|
|
'FML Java/MC Language Providers': [
|
|
'net.minecraftforge.fml.common',
|
|
'net.minecraftforge.fml.javafmlmod',
|
|
'net.minecraftforge.fml.mclanguageprovider'
|
|
],
|
|
'Minecraft Forge API': [
|
|
'net.minecraftforge*'
|
|
]
|
|
]
|
|
|
|
author = false
|
|
noSince = true
|
|
noHelp = true
|
|
|
|
bottom = "Minecraft Forge is an open source modding API for Minecraft: Java Edition, licensed under the Lesser GNU General Public License, version 2.1."
|
|
windowTitle = "Minecraft Forge API ${version}"
|
|
docTitle = "Minecraft Forge API - ${versions.forge} for Minecraft ${versions.minecraft}"
|
|
header = "<div style=\"margin-top: 9px;padding: 5px 6px;\"><strong>${versions.forge} for Minecraft ${versions.minecraft}</strong></div>"
|
|
}
|
|
|
|
doLast {
|
|
project.copy {
|
|
from docsDir
|
|
exclude '/stylesheet.css'
|
|
into destinationDir
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
final mdkZip = forgedev.consumeFile("mdkZip", project(':forge-mdk'))
|
|
convention.publish {
|
|
artifact universalJar
|
|
artifact forgedev.installer.jar
|
|
artifact(mdkZip.map { it.singleFile }) {
|
|
builtBy mdkZip
|
|
classifier = "mdk"
|
|
extension = "zip"
|
|
}
|
|
artifact forgedev.userDev.jar
|
|
artifact sourcesJar
|
|
artifact serverShim.jar
|
|
}
|
|
|
|
/*
|
|
// These are debugging tasks that are only used when developing ForgeDevPlugin, to bulk test task's config/caching
|
|
// region ForgeDev Tests
|
|
def all = tasks.register('all') {}
|
|
afterEvaluate {
|
|
if (gradle.startParameter.taskNames.contains('all')) {
|
|
tasks.forEach { task -> // This forces everything to be realized, which is why we have the startParameter check
|
|
if (!gradle.startParameter.isTaskGraph() && task.name.startsWith('run')) return
|
|
if (task.name in [all.name, 'dependencyInsight', 'dependencies', 'dependencyUpdates', 'init', 'buildEnvironment', 'idea',
|
|
'eclipse', 'javaToolchains', 'outgoingVariants', 'projects', 'properties', 'resolvableConfigurations', 'tasks', 'updateDaemonJvm',
|
|
'generateActionsWorkflow'
|
|
]) return
|
|
if (task.name.startsWith('clean')) return
|
|
if (task.name == 'checkJarCompatibility') return // This doesn't work in FG6 dev, I think it's cuz we check vs srg names. Will need to look at later
|
|
all.configure { dependsOn(task) }
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
// endregion
|
|
// We dont have any unit tests, so disable this error
|
|
tasks.withType(AbstractTestTask).configureEach {
|
|
failOnNoDiscoveredTests = false
|
|
}
|
|
// This shouldn't be needed according to the Gradle devs, as we never run these commands together.
|
|
// But in another case of Gradle being gradle, here we are
|
|
[ 'makePatches', 'compileJava', 'checkLicenseMain', 'updateLicenseMain', 'sourcesJar', 'sourcesJarAll' ]
|
|
.each{ tasks.named(it).configure{ mustRunAfter forgedev.patches.apply }}
|
|
forgedev.runs.configureEach {
|
|
run.configure { dependsOn finalizeSpawn }
|
|
}
|
|
// run gradlew dependencyUpdates --no-parallel
|
|
//noinspection UnnecessaryQualifiedReference
|
|
tasks.named('dependencyUpdates', com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask) {
|
|
resolutionStrategy {
|
|
mcpBase.dependencies.get().forEach {dep -> force(dep) } // Force all vanilla dependencies to their correct versions
|
|
force(earlyDisplayLibs.slf4j.jdk14) // Force slf4j implementation, its tied to the api from the manifest
|
|
}
|
|
} |