diff --git a/src/main/kotlin/dev/isxander/modstitch/base/BaseCommonImpl.kt b/src/main/kotlin/dev/isxander/modstitch/base/BaseCommonImpl.kt index 51f308e..5215e2f 100644 --- a/src/main/kotlin/dev/isxander/modstitch/base/BaseCommonImpl.kt +++ b/src/main/kotlin/dev/isxander/modstitch/base/BaseCommonImpl.kt @@ -4,6 +4,9 @@ import dev.isxander.modstitch.* import dev.isxander.modstitch.base.extensions.* import dev.isxander.modstitch.util.Platform import dev.isxander.modstitch.util.afterSuccessfulEvaluate +import dev.isxander.modstitch.util.assignIfNotNull +import dev.isxander.modstitch.util.deepGradleProperty +import dev.isxander.modstitch.util.gradleProperty import dev.isxander.modstitch.util.mainSourceSet import dev.isxander.modstitch.util.platform import dev.isxander.modstitch.util.printVersion @@ -36,9 +39,6 @@ abstract class BaseCommonImpl( // Set the property for use elsewhere target.platform = platform - // Apply the necessary plugins - applyPlugins(target) - // Create our plugin extension val msExt = target.extensions.create( ModstitchExtension::class.java, @@ -47,6 +47,11 @@ abstract class BaseCommonImpl( this ) + applyGradleProperties(target) + + // Apply the necessary plugins + applyPlugins(target) + // Ensure the archivesBaseName is our mod-id target.pluginManager.withPlugin("base") { target.extensions.configure { @@ -154,6 +159,35 @@ abstract class BaseCommonImpl( } } + /** + * Applies from gradle.properties to a bunch of extension defaults. + * Executed before the user can touch the extensions so they can safely change all of this. + */ + protected open fun applyGradleProperties(target: Project) { + val modstitch = target.modstitch + modstitch.modLoaderVersion assignIfNotNull target.deepGradleProperty("modstitch.modLoaderVersion") + modstitch.minecraftVersion assignIfNotNull target.deepGradleProperty("modstitch.minecraftVersion") + modstitch.javaVersion assignIfNotNull target.deepGradleProperty("modstitch.javaVersion")?.toIntOrNull() + modstitch.parchment.minecraftVersion assignIfNotNull target.deepGradleProperty("modstitch.parchment.minecraftVersion") + modstitch.parchment.mappingsVersion assignIfNotNull target.deepGradleProperty("modstitch.parchment.mappingsVersion") + modstitch.parchment.parchmentArtifact assignIfNotNull target.deepGradleProperty("modstitch.parchment.parchmentArtifact") + modstitch.parchment.enabled assignIfNotNull target.deepGradleProperty("modstitch.parchment.enabled")?.toBooleanStrictOrNull() + modstitch.metadata.modId assignIfNotNull target.deepGradleProperty("modstitch.metadata.modId") + modstitch.metadata.modName assignIfNotNull target.deepGradleProperty("modstitch.metadata.modName") + modstitch.metadata.modVersion assignIfNotNull target.deepGradleProperty("modstitch.metadata.modVersion") + modstitch.metadata.modDescription assignIfNotNull target.deepGradleProperty("modstitch.metadata.modDescription") + modstitch.metadata.modLicense assignIfNotNull target.deepGradleProperty("modstitch.metadata.modLicense") + modstitch.metadata.modGroup assignIfNotNull target.deepGradleProperty("modstitch.metadata.modGroup") + modstitch.metadata.modAuthor assignIfNotNull target.deepGradleProperty("modstitch.metadata.modAuthor") + modstitch.metadata.modCredits assignIfNotNull target.deepGradleProperty("modstitch.metadata.modCredits") + modstitch.metadata.overwriteProjectVersionAndGroup assignIfNotNull target.deepGradleProperty("modstitch.metadata.overwriteProjectVersionAndGroup")?.toBooleanStrictOrNull() + modstitch.mixin.addMixinsToModManifest assignIfNotNull target.deepGradleProperty("modstitch.mixin.addMixinsToModManifest")?.toBooleanStrictOrNull() + modstitch.accessWidener assignIfNotNull target.deepGradleProperty("modstitch.accessWidener") { v, p -> p.file(v) } + modstitch.accessWidenerName assignIfNotNull target.deepGradleProperty("modstitch.accessWidenerName") + modstitch.validateAccessWidener assignIfNotNull target.deepGradleProperty("modstitch.validateAccessWidener")?.toBooleanStrictOrNull() + modstitch.modLoaderManifest assignIfNotNull target.deepGradleProperty("modstitch.modLoaderManifest") + } + /** * Ensures templates in files like fabric.mod.json are replaced. * e.g. ${mod_id} -> my_mod diff --git a/src/main/kotlin/dev/isxander/modstitch/base/loom/BaseLoomImpl.kt b/src/main/kotlin/dev/isxander/modstitch/base/loom/BaseLoomImpl.kt index dbadbe1..d8c4b46 100644 --- a/src/main/kotlin/dev/isxander/modstitch/base/loom/BaseLoomImpl.kt +++ b/src/main/kotlin/dev/isxander/modstitch/base/loom/BaseLoomImpl.kt @@ -26,10 +26,10 @@ class BaseLoomImpl : BaseCommonImpl( ) override fun apply(target: Project) { - super.apply(target) - val fabricExt = createRealPlatformExtension(target)!! + super.apply(target) + target.dependencies { "minecraft"(target.modstitch.minecraftVersion.map { "com.mojang:minecraft:$it" }) @@ -123,6 +123,13 @@ class BaseLoomImpl : BaseCommonImpl( repositories.maven("https://maven.fabricmc.net") { name = "FabricMC" } } + override fun applyGradleProperties(target: Project) { + super.applyGradleProperties(target) + target.modstitch.loom { + fabricLoaderVersion assignIfNotNull target.deepGradleProperty("modstitch.loom.fabricLoaderVersion") + } + } + override fun applyMetadataStringReplacements(target: Project): TaskProvider { val generateModMetadata = super.applyMetadataStringReplacements(target) diff --git a/src/main/kotlin/dev/isxander/modstitch/base/moddevgradle/BaseModDevGradleImpl.kt b/src/main/kotlin/dev/isxander/modstitch/base/moddevgradle/BaseModDevGradleImpl.kt index e297704..cb64b3c 100644 --- a/src/main/kotlin/dev/isxander/modstitch/base/moddevgradle/BaseModDevGradleImpl.kt +++ b/src/main/kotlin/dev/isxander/modstitch/base/moddevgradle/BaseModDevGradleImpl.kt @@ -7,6 +7,8 @@ import dev.isxander.modstitch.util.Platform import dev.isxander.modstitch.util.PlatformExtensionInfo import dev.isxander.modstitch.util.addCamelCasePrefix import dev.isxander.modstitch.util.afterSuccessfulEvaluate +import dev.isxander.modstitch.util.assignIfNotNull +import dev.isxander.modstitch.util.deepGradleProperty import dev.isxander.modstitch.util.mainSourceSet import net.neoforged.moddevgradle.dsl.ModDevExtension import net.neoforged.moddevgradle.dsl.NeoForgeExtension @@ -44,6 +46,7 @@ class BaseModDevGradleImpl( override fun apply(target: Project) { val ext = createRealPlatformExtension(target, type)!! + super.apply(target) val modstitch = target.modstitch @@ -184,6 +187,16 @@ class BaseModDevGradleImpl( }) } + override fun applyGradleProperties(target: Project) { + super.applyGradleProperties(target) + target.modstitch.moddevgradle { + neoForgeVersion assignIfNotNull target.deepGradleProperty("modstitch.moddevgradle.neoForgeVersion") + forgeVersion assignIfNotNull target.deepGradleProperty("modstitch.moddevgradle.forgeVersion") + neoFormVersion assignIfNotNull target.deepGradleProperty("modstitch.moddevgradle.neoFormVersion") + mcpVersion assignIfNotNull target.deepGradleProperty("modstitch.moddevgradle.mcpVersion") + } + } + override fun applyMetadataStringReplacements(target: Project): TaskProvider { val generateModMetadata = super.applyMetadataStringReplacements(target) diff --git a/src/main/kotlin/dev/isxander/modstitch/util/ProjectUtils.kt b/src/main/kotlin/dev/isxander/modstitch/util/ProjectUtils.kt index af918c2..0dc765a 100644 --- a/src/main/kotlin/dev/isxander/modstitch/util/ProjectUtils.kt +++ b/src/main/kotlin/dev/isxander/modstitch/util/ProjectUtils.kt @@ -2,8 +2,12 @@ package dev.isxander.modstitch.util import org.gradle.api.Action import org.gradle.api.Project +import org.gradle.api.file.FileSystemLocation +import org.gradle.api.file.FileSystemLocationProperty +import org.gradle.api.provider.Property import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSetContainer +import java.io.File /** * Gets the [SourceSetContainer] from the project's extensions, if available. @@ -33,3 +37,25 @@ internal fun Project.afterSuccessfulEvaluate(action: Action) = project. action.execute(this) } } + +internal fun Project.gradleProperty(key: String): String? = + project.findProperty(key) as String? + +/** + * Searches for a gradle property deeply through the project tree + */ +internal fun Project.deepGradleProperty(key: String, map: (String, Project) -> T): T? { + var project: Project? = project + while (project != null) { + project.gradleProperty(key)?.let { return map(it, project!!) } + project = project.parent + } + return null +} +internal fun Project.deepGradleProperty(key: String): String? = + deepGradleProperty(key) { str, p -> str } + +internal infix fun Property.assignIfNotNull(value: T?) = + value?.let { set(it) } +internal infix fun FileSystemLocationProperty.assignIfNotNull(value: File?) = + value?.let { set(it) } diff --git a/test-project/build.gradle.kts b/test-project/build.gradle.kts index acfcd2b..9916d49 100644 --- a/test-project/build.gradle.kts +++ b/test-project/build.gradle.kts @@ -1,38 +1,13 @@ modstitch { - minecraftVersion = findProperty("minecraftVersion") as String? - javaVersion = 17 - - loom { - fabricLoaderVersion = findProperty("fabricLoaderVersion") as String? - } - - moddevgradle { - neoForgeVersion = findProperty("neoForgeVersion") as String? - forgeVersion = findProperty("forgeVersion") as String? - mcpVersion = findProperty("mcpVersion") as String? - neoFormVersion = findProperty("neoFormVersion") as String? - } - println(modLoaderManifest.getOrElse("'modLoaderManifest' is not set.")) println(javaVersion.map { "Java version: $it" }.getOrElse("'javaVersion' is not set.")) - metadata { - modId = "test_project" - modGroup = "dev.isxander" - modVersion = "1.0.0" - modLicense = "ARR" - modName = "Test Project" - modDescription = "A test project for ModStitch" - } - moddevgradle { defaultRuns() } mixin { configs.create("test") - - addMixinsToModManifest = true } } diff --git a/test-project/fabric/gradle.properties b/test-project/fabric/gradle.properties index 461a227..639164d 100644 --- a/test-project/fabric/gradle.properties +++ b/test-project/fabric/gradle.properties @@ -1,4 +1,4 @@ modstitch.platform=loom -minecraftVersion=1.21.4 -fabricLoaderVersion=0.16.10 +modstitch.minecraftVersion=1.21.4 +modstitch.modLoaderVersion=0.16.10 diff --git a/test-project/forge/gradle.properties b/test-project/forge/gradle.properties index e59d2fd..d2bc52f 100644 --- a/test-project/forge/gradle.properties +++ b/test-project/forge/gradle.properties @@ -1,4 +1,4 @@ modstitch.platform=moddevgradle-legacy -minecraftVersion=1.20.1 -forgeVersion=1.20.1-47.3.0 \ No newline at end of file +modstitch.minecraftVersion=1.20.1 +modstitch.modLoaderVersion=1.20.1-47.3.0 \ No newline at end of file diff --git a/test-project/gradle.properties b/test-project/gradle.properties index 4b15056..57256a7 100644 --- a/test-project/gradle.properties +++ b/test-project/gradle.properties @@ -1,3 +1,7 @@ org.gradle.configuration-cache=true -modstitch.platform=parent \ No newline at end of file +modstitch.platform=parent +modstitch.metadata.modId=test_mod +modstitch.metadata.modName=Test Mod +modstitch.metadata.modVersion=1.2.3 +modstitch.mixin.addMixinsToModManifest=true \ No newline at end of file diff --git a/test-project/neoforge/gradle.properties b/test-project/neoforge/gradle.properties index 17370a0..0557db0 100644 --- a/test-project/neoforge/gradle.properties +++ b/test-project/neoforge/gradle.properties @@ -1,4 +1,4 @@ modstitch.platform=moddevgradle -minecraftVersion=1.20.4 -neoForgeVersion=20.4.239 \ No newline at end of file +modstitch.minecraftVersion=1.20.4 +modstitch.modLoaderVersion=20.4.239 \ No newline at end of file