diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1711fa5..f53aab4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,6 +10,7 @@ on: tags-ignore: - '**' pull_request: + workflow_dispatch: permissions: id-token: write @@ -17,20 +18,23 @@ permissions: contents: write jobs: - release: + build: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: JDK Setup - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 25 distribution: 'temurin' - name: Gradle Setup - uses: gradle/actions/setup-gradle@v4 + # note: setup-gradle v6+ has switched to a proprietary license. + # pin this to v5 for the foreseeable future. + # https://blog.gradle.org/github-actions-for-gradle-v6 + uses: gradle/actions/setup-gradle@v5 with: validate-wrappers: true @@ -41,17 +45,16 @@ jobs: run: ./gradlew build - name: Attest Build Provenance - uses: actions/attest-build-provenance@v2 + if: github.event_name != 'pull_request' + uses: actions/attest@v4 with: - subject-path: 'build/libs/*.jar, !build/libs/*-sources.jar' + subject-path: 'build/libs/*.jar' - name: Upload Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: Artifacts - path: | - build/libs/*.jar - !build/libs/*-sources.jar + path: build/libs/*.jar - name: Maven Publish if: github.event_name == 'release' && github.event.action == 'published' @@ -59,9 +62,9 @@ jobs: - name: Github Publish if: github.event_name == 'release' && github.event.action == 'published' - uses: AButler/upload-release-assets@v2.0 + uses: AButler/upload-release-assets@v3.0 with: - files: 'build/libs/*.jar;!build/libs/*-sources.jar' + files: 'build/libs/*.jar' repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Modrinth Publish @@ -69,6 +72,4 @@ jobs: MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} CHANGELOG: ${{ github.event.release.body }} if: ${{ github.event_name == 'release' && github.event.action == 'published' && env.MODRINTH_TOKEN != '' }} - run: | - ./gradlew --no-configuration-cache modrinth - ./gradlew --no-configuration-cache modrinthSyncBody + run: ./gradlew publishMods diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 43c6a05..0000000 --- a/build.gradle +++ /dev/null @@ -1,91 +0,0 @@ -//file:noinspection GroovyAssignabilityCheck -//file:noinspection GroovyAccessibility -plugins { - id "maven-publish" - alias libs.plugins.loom - alias libs.plugins.minotaur -} - -version = "$modVersion+$branchName" -base.archivesName = project.slug - -repositories { - // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven - // To use in a dependency, use: maven.modrinth:mod-id - exclusiveContent { - forRepository { - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - } - } - filter { - includeGroup("maven.modrinth") - } - } -} - -dependencies { - minecraft libs.mc - - implementation libs.fl - implementation libs.fapi -} - -processResources { - final Map meta = [ - version : version, - modId : modId, - modName : modName, - modDescription: modDescription, - homepage : "https://modrinth.com/mod/${slug}", - issues : "https://github.com/${user}/${slug}/issues", - sources : "https://github.com/${user}/${slug}", - license : license, - authors : authors.split(", ").join("\",\n \""), - contributors : contributors.split(", ").join("\",\n \""), - members : "${authors}${contributors ? ". Contributions by ${contributors}." : ""}", - mc : compatibleVersions.split(", ")[0], - fl : libs.versions.fl.get(), - fapi : libs.versions.fapi.get(), - ] - inputs.properties meta - filesMatching("*.mod.json") { expand(meta) } - filesMatching("META-INF/*mods.toml") { expand(meta) } -} - -tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - it.options.release = 25 -} - -java { - withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_25 - targetCompatibility = JavaVersion.VERSION_25 -} - - -publishing { - repositories { - } - publications { - mavenJava(MavenPublication) { - from components.java - } - } -} - -modrinth { - token = "$System.env.MODRINTH_TOKEN" - projectId = slug - versionNumber = project.version - uploadFile = jar - gameVersions = compatibleVersions.split(", ").toList() - loaders = compatibleLoaders.split(", ").toList() - changelog = "$System.env.CHANGELOG" - syncBodyFrom = "\n" + rootProject.file("README.md").text - dependencies { - required.version "fabric-api", libs.versions.fapi.get() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..2daa6a6 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,95 @@ +plugins { + alias(libs.plugins.loom) + alias(libs.plugins.mod.publish) + `maven-publish` +} + +val modVersion: String by project +val branchName: String by project +val slug: String by project +val compatibleVersions: String by project + +version = "$modVersion+$branchName" + +dependencies { + minecraft(libs.minecraft) + api(libs.bundles.fabric) +} + +java { + withSourcesJar() + toolchain.languageVersion = JavaLanguageVersion.of(25) +} + +tasks.processResources { + val user: String by project + val authors: String by project + val contributors: String by project + + val meta: Map = mapOf( + "version" to project.version, + "modId" to providers.gradleProperty("modId"), + "modName" to providers.gradleProperty("modName"), + "modDescription" to providers.gradleProperty("modDescription"), + "homepage" to "https://modrinth.com/mod/$slug", + "issues" to "https://github.com/$user/$slug/issues", + "sources" to "https://github.com/$user/$slug", + "license" to providers.gradleProperty("license"), + "authors" to authors.split(", ").joinToString("\",\n \""), + "contributors" to contributors.split(", ").joinToString("\",\n \""), + "members" to "$authors${if (contributors.isEmpty()) "" else ". Contributions by $contributors."}", + "minecraftVersion" to compatibleVersions.split(", ")[0], + "fabricLoaderVersion" to libs.versions.fabric.loader, + "fabricApiVersion" to libs.versions.fabric.api + ) + + inputs.properties(meta) + + filesMatching(listOf("*.mod.json", "META-INF/*mods.toml")) { + // providers must be invoked manually or else you get stuff like "provider(?)" instead of "mod-id" + expand(meta.mapValues { when (val value = it.value) { + is Provider<*> -> value.get() + else -> value + }}) + } +} + +publishing { + publications { + register("mavenJava") { + from(components["java"]) + } + } +} + +publishMods { + file = tasks.jar.flatMap { it.archiveFile } + additionalFiles.from(tasks.named("sourcesJar")) + changelog = providers.environmentVariable("CHANGELOG") + + type = version.map { when { + it.contains("alpha") -> ALPHA + it.contains("beta") -> BETA + else -> STABLE + }} + + val compatibleLoaders: String by project + val readme: RegularFile = rootProject.layout.projectDirectory.file("README.md") + + modrinth { + projectId = slug + accessToken = providers.environmentVariable("MODRINTH_TOKEN") + + minecraftVersions.addAll(compatibleVersions.split(", ")) + modLoaders.addAll(compatibleLoaders.split(", ")) + + projectDescription = providers.fileContents(readme).asText.map { + "\n$it" + } + + requires { + slug = "fabric-api" + version = libs.versions.fabric.api + } + } +} diff --git a/gradle.properties b/gradle.properties index 8692522..fed5458 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,16 @@ -# Gradle -org.gradle.jvmargs=-Xmx2G -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 +# Allocate additional memory to the Gradle JVM. The default is often not enough to decompile Minecraft. +org.gradle.jvmargs=-Xmx2G + +# Various flags to optimize Gradle performance. +org.gradle.parallel=true org.gradle.caching=true -org.gradle.configureondemand=true org.gradle.configuration-cache=true -# Loom -fabric.loom.multiProjectOptimisation=true +org.gradle.configuration-cache.parallel=true +org.gradle.configureondemand=true + +# Enable all Gradle warnings +org.gradle.warning.mode=all + # Mod Metadata group=io.github.username user=username diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..4718434 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,20 @@ +[versions] +loom = "1.15.+" +mod-publish = "1.1.0" + +minecraft = "26.1.1" +# https://fabricmc.net/develop/ +fabric-loader = "0.18.4" +fabric-api = "0.145.4+26.1.1" + +[plugins] +loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } +mod-publish = { id = "me.modmuss50.mod-publish-plugin", version.ref = "mod-publish" } + +[libraries] +minecraft = { group = "mojang", name = "minecraft", version.ref = "minecraft" } +fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" } +fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric-api" } + +[bundles] +fabric = [ "fabric-loader", "fabric-api" ] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55..d997cfc 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a9..739907d 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index db3a6ac..c4bdd3a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/libs.versions.toml b/libs.versions.toml deleted file mode 100644 index 836285c..0000000 --- a/libs.versions.toml +++ /dev/null @@ -1,16 +0,0 @@ -[versions] -loom = "1.15-SNAPSHOT" -minotaur = "2.+" - -mc = "26.1-snapshot-9" -fl = "0.18.4" -fapi = "0.143.5+26.1" - -[plugins] -loom = { id = "net.fabricmc.fabric-loom", version.ref = "loom" } -minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } - -[libraries] -mc = { group = "mojang", name = "minecraft", version.ref = "mc" } -fl = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fl" } -fapi = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fapi" } diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index dce0b1d..0000000 --- a/settings.gradle +++ /dev/null @@ -1,14 +0,0 @@ -pluginManagement { - repositories { - maven { url "https://maven.fabricmc.net/" } - gradlePluginPortal() - } -} - -dependencyResolutionManagement { - versionCatalogs { - create("libs") { - from(files("libs.versions.toml")) - } - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..99b5a08 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,21 @@ +val slug: String by settings +rootProject.name = slug + +pluginManagement { + repositories { + maven("https://maven.fabricmc.net/") + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositories { + // Modrinth Maven - see: https://support.modrinth.com/en/articles/8801191-modrinth-maven + // Mods may be pulled from here will this format: "maven.modrinth::" + exclusiveContent { + forRepositories(maven("https://api.modrinth.com/maven")).filter { + includeGroup("maven.modrinth") + } + } + } +} diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index fcfe7a4..9f76482 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -32,13 +32,13 @@ side = "BOTH" [[dependencies."${ modId }"]] modId = "minecraft" type = "required" -versionRange = "[${mc},)" +versionRange = "[${minecraftVersion},)" ordering = "NONE" side = "BOTH" [[dependencies."${ modId }"]] modId = "fabric_api" type = "required" -versionRange = "[${fapi},)" +versionRange = "[${fabricApiVersion},)" ordering = "NONE" side = "BOTH" diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ebd4046..3356d89 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,9 +21,9 @@ "${modId}.mixins.json" ], "depends": { - "minecraft": ">=${mc}", - "fabricloader": ">=${fl}", - "fabric-api": ">=${fapi}" + "minecraft": ">=${minecraftVersion}", + "fabricloader": ">=${fabricLoaderVersion}", + "fabric-api": ">=${fabricApiVersion}" }, "suggests": { },