From 53a25b7693608933268f25b498b93a93a4aeb5d1 Mon Sep 17 00:00:00 2001 From: Luke Bemish Date: Mon, 4 Mar 2024 17:00:34 -0600 Subject: [PATCH] Fix published dependency metadata and use groovybundler --- build.gradle | 193 ++++++++++++------------------------- gradle.properties | 2 +- gradle/compiler.gradle | 5 - gradle/jars.gradle | 73 -------------- gradle/mdg.gradle | 25 ----- gradle/minecraft.gradle | 35 ------- gradle/projectSetup.gradle | 48 --------- gradle/publishing.gradle | 152 ----------------------------- script-mods/build.gradle | 2 +- 9 files changed, 61 insertions(+), 474 deletions(-) delete mode 100644 gradle/compiler.gradle delete mode 100644 gradle/jars.gradle delete mode 100644 gradle/mdg.gradle delete mode 100644 gradle/minecraft.gradle delete mode 100644 gradle/projectSetup.gradle delete mode 100644 gradle/publishing.gradle diff --git a/build.gradle b/build.gradle index 1ca0c35..86120bb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,6 @@ -import com.matyrobbrt.gradle.jarinjar.task.* +import com.matyrobbrt.gradle.jarinjar.task.ForgeJarInJarTask import com.matyrobbrt.gradle.jarinjar.transform.ForgeManifestFixerTransformer -import groovy.transform.CompileStatic import org.groovymc.modsdotgroovy.gradle.MDGExtension -import org.w3c.dom.Document -import org.w3c.dom.Element plugins { id 'java-library' @@ -25,6 +22,8 @@ base { archivesName = 'gml-core' } +java.withSourcesJar() + managedVersioning { versionFile.set rootProject.file('version.properties') @@ -72,9 +71,21 @@ repositories { sourceSets.main.extensions.getByType(MDGExtension).disable() sourceSets.test.extensions.getByType(MDGExtension).enable() +sourceSets.each { + def localRuntime = configurations.maybeCreate(it.getTaskName(null, 'localRuntime')) + configurations.named(it.runtimeClasspathConfigurationName).configure { + extendsFrom localRuntime + } +} + configurations { - groovy - compileOnly.extendsFrom(groovy) + include + groovy { + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)) + } + } + compileOnlyApi.extendsFrom(groovy) testCompileOnly.extendsFrom(groovy) extensionCompileOnly.extendsFrom(groovy) transformCompileOnly.extendsFrom(groovy) @@ -83,6 +94,17 @@ configurations { implementation.extendsFrom(mc) extensionCompileOnly.extendsFrom(mc) transformCompileOnly.extendsFrom(mc) + + javadocElements { + canBeConsumed = true + canBeResolved = false + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, Category.DOCUMENTATION)) + attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.class, Bundling.EXTERNAL)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.class, DocsType.JAVADOC)) + } + } } tasks.register('fullJar', ForgeJarInJarTask) @@ -115,16 +137,6 @@ runs { } } -final groovyLibs = [ - 'stdlib', 'contracts', 'datetime', - 'nio', 'macro', 'macro-library', - 'templates', 'typecheckers', - - 'dateutil', 'ginq', - - 'toml', 'json' -] - dependencies { minecraft "net.neoforged:neoforge:20.4.167" @@ -132,23 +144,20 @@ dependencies { compileOnly(testCompileOnly(sourceSets.extension.output)) testCompileOnly(sourceSets.transform.output) - groovyLibs.each { - groovy groovyDep(it as String) + groovy "org.groovymc:groovybundler:${project.groovybundler_version}" + include("org.groovymc:groovybundler:${project.groovybundler_version}") { + transitive = false } - runtimeOnly(files(project.tasks.fullJar.archiveFile)) + localRuntime(files(project.tasks.fullJar.archiveFile) { + builtBy(project.tasks.fullJar) + }) } -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation -} - -String groovyDep(final String name) { - return "${groovyId(name)}:${project.groovy_version}" -} - -static String groovyId(final String name) { - return "org.apache.groovy:groovy${name == 'stdlib' ? '' : '-' + name}" +sourceSets.each { + tasks.named(it.compileJavaTaskName, JavaCompile).configure { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation + } } jij.onConfiguration('groovy') { @@ -166,57 +175,22 @@ final manifestAttr = [ 'Implementation-Title' : project.name, 'Implementation-Version': project.version, 'Implementation-Vendor' : 'GroovyMC', - 'BundledGroovyVersion' : project.groovy_version, - 'GitCommit' : getGitCommit(), + 'GitCommit' : managedVersioning.hash, 'FMLModType' : 'LIBRARY' ] tasks.named('jar', Jar).configure { from sourceSets.extension.output + from sourceSets.transform.output manifest.attributes(manifestAttr + [ 'Automatic-Module-Name': 'org.groovymc.gml' ]) archiveClassifier = 'slim' } -final transformDest = new File(buildDir, 'libs/transform') -tasks.register('transformJar', Jar) { - from sourceSets.transform.output - manifest.attributes(manifestAttr + [ - 'Specification-Title': 'GML-Transform' - ]) - archiveBaseName.set('transform') - destinationDirectory.set(transformDest) -} - -tasks.register('transformSources', Jar) { +tasks.named('sourcesJar', Jar).configure { + from sourceSets.extension.allSource from sourceSets.transform.allSource - archiveBaseName.set('transform') - archiveClassifier.set('sources') - destinationDirectory.set(transformDest) -} - -tasks.register('transformGroovydoc', Groovydoc) { - source sourceSets.transform.allSource - classpath = sourceSets.main.compileClasspath - destinationDir = new File(transformDest, 'groovydoc') -} - -tasks.register('transformJavadocJar', Jar) { - archiveClassifier = 'javadoc' - from tasks.transformGroovydoc.destinationDir - dependsOn('transformGroovydoc') - destinationDirectory.set(transformDest) -} - -tasks.register('groovyJar', ForgeJarInJarTask) { - group('build') - archiveBaseName.set('groovy-fat') - fromConfiguration(project.configurations.groovy) - manifest.attributes(manifestAttr + [ - 'Specification-Title': 'GML-GroovyFatJar', - 'Automatic-Module-Name': 'org.groovymc.gml.groovyjij' - ]) } tasks.named('fullJar', ForgeJarInJarTask).configure { @@ -228,8 +202,7 @@ tasks.named('fullJar', ForgeJarInJarTask).configure { ]) archiveClassifier.set('') group('build') - - fromJar(tasks.named('groovyJar')) { versionRange nextMajor } + fromConfiguration(project.configurations.include) tasks.build.dependsOn(it) } @@ -248,10 +221,9 @@ tasks.withType(GroovyCompile).configureEach { GroovyCompile task -> task.groovyOptions.optimizationOptions.indy = true } -java.withSourcesJar() -java.withJavadocJar() - groovydoc { + source sourceSets.extension.allSource + source sourceSets.transform.allSource use = true } @@ -261,10 +233,18 @@ tasks.register('groovydocJar', Jar) { dependsOn(groovydoc) } -static String getGitCommit() { - final proc = 'git rev-parse --short HEAD'.execute() - proc.waitFor() - return proc.exitValue() ? "ERROR(${proc.exitValue()})" : proc.text.trim() +configurations.runtimeElements.artifacts.clear() +configurations.apiElements.artifacts.clear() + +artifacts { + javadocElements groovydocJar + runtimeElements fullJar + apiElements fullJar +} + +project.components.named("java").configure { + AdhocComponentWithVariants javaComponent = (AdhocComponentWithVariants) it + javaComponent.addVariantsFromConfiguration(configurations.javadocElements) {} } void sharedMetadata(MavenPom it) { @@ -304,45 +284,13 @@ nexusPublishing { publishing { publications { register('mavenJava', MavenPublication) { - it.artifacts = [ - jar, sourcesJar, fullJar, groovydocJar - ] - it.artifactId = 'gml-core' + from components.java + it.artifactId = base.archivesName.get() pom { name = 'GML' description = 'A language provider for Forge mods for Groovy' sharedMetadata(it) - withXml { XmlProvider xml -> - final element = xml.asElement() - var depsElem = element.getOwnerDocument().createElement('dependencies') - var owner = element.getOwnerDocument() - var deps = (DependencySet) project.configurations.groovy.getDependencies() - deps.each { - depsElem.appendChild createDependency(owner, it.group, it.name, it.version, 'compile') - } - depsElem.appendChild createDependency(owner, project.group, 'transform', project.version, 'compile') - element.appendChild(depsElem) - } - } - } - register('transform', MavenPublication) { - it.artifactId = 'transform' - it.artifacts = [transformJar, transformSources, transformJavadocJar] - pom { - name = 'GML - Transform' - description = 'Compile-time transforms for GML' - sharedMetadata(it) - withXml { XmlProvider xml -> - final element = xml.asElement() - var depsElem = element.getOwnerDocument().createElement('dependencies') - var owner = element.getOwnerDocument() - var deps = (DependencySet) project.configurations.groovy.getDependencies() - deps.each { - depsElem.appendChild createDependency(owner, it.group, it.name, it.version, 'compile') - } - element.appendChild(depsElem) - } } } } @@ -363,26 +311,3 @@ if (System.getenv('GPG_SIGNING_KEY')) { sign publishing.publications.transform } } - -@CompileStatic -static Element createDependency(Document owner, String group, String name, String version, String scope) { - var sub = owner.createElement('dependency') - - var groupEl = owner.createElement('groupId') - groupEl.appendChild(owner.createTextNode(group)) - sub.appendChild groupEl - - var artEl = owner.createElement('artifactId') - artEl.appendChild(owner.createTextNode(name)) - sub.appendChild artEl - - var verEl = owner.createElement('version') - verEl.appendChild(owner.createTextNode(version)) - sub.appendChild verEl - - var scopeEl = owner.createElement('scope') - scopeEl.appendChild(owner.createTextNode(scope)) - sub.appendChild scopeEl - - return sub -} diff --git a/gradle.properties b/gradle.properties index b727be8..c479009 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,6 +3,6 @@ org.gradle.parallel=true org.gradle.daemon=false # Groovy -groovy_version=4.0.16 +groovybundler_version=2.1.1 fml_version=2.0.13 diff --git a/gradle/compiler.gradle b/gradle/compiler.gradle deleted file mode 100644 index 4842048..0000000 --- a/gradle/compiler.gradle +++ /dev/null @@ -1,5 +0,0 @@ -tasks.withType(GroovyCompile).configureEach { GroovyCompile task -> - task.groovyOptions.fork = true - task.groovyOptions.encoding = 'UTF-8' - task.groovyOptions.optimizationOptions.indy = true -} \ No newline at end of file diff --git a/gradle/jars.gradle b/gradle/jars.gradle deleted file mode 100644 index ce64eb2..0000000 --- a/gradle/jars.gradle +++ /dev/null @@ -1,73 +0,0 @@ -tasks.register('modJar', Jar) { - from sourceSets.mod.output - manifest.attributes(manifestAttr - ['FMLModType': 'LANGPROVIDER']) - archiveBaseName.set('mod') -} - -tasks.named('jar', Jar).configure { - from sourceSets.extension.output - manifest.attributes(manifestAttr + [ - 'Automatic-Module-Name': 'org.groovymc.gml', 'FMLModType': 'LANGPROVIDER' - ]) -} - -java.withSourcesJar() -java.withJavadocJar() - -groovydoc { - use = true - source(sourceSets.transform.allSource) - source(sourceSets.extension.allSource) -} - -tasks.register('groovydocJar', Jar) { - classifier 'javadoc' - from groovydoc.destinationDir - dependsOn(groovydoc) -} - -final transformDest = new File(buildDir, 'libs/transform') -final transformAttr = manifestAttr + [ - 'Specification-Title': 'GML-Transform' -] -tasks.register('transformJar', Jar) { - from sourceSets.transform.output - manifest.attributes(transformAttr) - archiveBaseName.set('transform') - destinationDirectory.set(transformDest) -} - -tasks.register('transformSources', Jar) { - from sourceSets.transform.allSource - manifest.attributes(transformAttr) - archiveBaseName.set('transform') - archiveClassifier.set('sources') - destinationDirectory.set(transformDest) -} - -tasks.register('transformGroovydoc', Groovydoc) { - source sourceSets.transform.allSource - classpath = sourceSets.transform.compileClasspath - destinationDir = new File(transformDest, 'groovydoc') -} - -tasks.register('transformJavadocJar', Jar) { - classifier 'javadoc' - from tasks.transformGroovydoc.destinationDir - dependsOn('transformGroovydoc') - destinationDirectory.set(transformDest) -} - -tasks.register('testJar', Jar) { - group 'build' - from sourceSets.test.output - classifier 'test' - manifest.attributes([ - 'Specification-Title': 'GMLTestMod', - 'Specification-Vendor': 'Matyrobbrt', - 'Specification-Version': '1', - 'Implementation-Title': 'GMLTestMod', - 'Implementation-Version': '1.0', - 'Implementation-Vendor': 'Matyrobbrt' - ]) -} \ No newline at end of file diff --git a/gradle/mdg.gradle b/gradle/mdg.gradle deleted file mode 100644 index 0d3385a..0000000 --- a/gradle/mdg.gradle +++ /dev/null @@ -1,25 +0,0 @@ -import io.github.groovymc.modsdotgroovy.ConvertToTomlTask -import io.github.groovymc.modsdotgroovy.ModsDotGroovy - -buildscript { - repositories { - mavenCentral() - gradlePluginPortal() - } - dependencies { - classpath 'org.groovymc.modsdotgroovy:ModsDotGroovy:1.4.+' - } -} - -apply plugin: ModsDotGroovy - -modsDotGroovy { - dslVersion = '1.5.0' - automaticConfiguration = false -} -tasks.create('testModsDotGroovyToToml', ConvertToTomlTask) { - it.configureForSourceSet(sourceSets.test) -} -tasks.create('modModsDotGroovyToToml', ConvertToTomlTask) { - it.configureForSourceSet(sourceSets.mod) -} diff --git a/gradle/minecraft.gradle b/gradle/minecraft.gradle deleted file mode 100644 index 12a5b29..0000000 --- a/gradle/minecraft.gradle +++ /dev/null @@ -1,35 +0,0 @@ -minecraft { - mappings channel: 'official', version: mc_version - runs { - client {} - server {} - jijtest { - parent runs.client - mods { - test { - source sourceSets.test - } - } - } - } -} - -dependencies { - if ('runJijtest' in gradle.startParameter.taskNames) { - runtimeOnly files( - tasks.named('jijtestJar').map { it.archiveFile.get().asFile } - ) - } else { - runtimeOnly files( - tasks.named('fullJar').map { it.archiveFile.get().asFile } - ) - } -} - -tasks.whenTaskAdded { - if (it.name == 'runClient' || it.name == 'runServer') { - it.dependsOn(':fullJar') - } else if (it.name == 'runJijtest') { - it.dependsOn(':jijtestJar') - } -} \ No newline at end of file diff --git a/gradle/projectSetup.gradle b/gradle/projectSetup.gradle deleted file mode 100644 index f405797..0000000 --- a/gradle/projectSetup.gradle +++ /dev/null @@ -1,48 +0,0 @@ -configurations { - globalCompile - compileOnly.extendsFrom(globalCompile) - transformCompileOnly.extendsFrom(globalCompile) - testCompileOnly.extendsFrom(globalCompile) - modCompileOnly.extendsFrom(globalCompile) - extensionCompileOnly.extendsFrom(globalCompile) - - globalAP - annotationProcessor.extendsFrom(globalAP) - transformAnnotationProcessor.extendsFrom(globalAP) - testAnnotationProcessor.extendsFrom(globalAP) - modAnnotationProcessor.extendsFrom(globalAP) - - groovy - globalCompile.extendsFrom(groovy) - - include - includeLibrary -} - -sourceSets { - transform { - compileClasspath += configurations.getByName('minecraft') - } - extension { - compileClasspath += configurations.getByName('minecraft') - } - test { - groovy { - compileClasspath += extension.output - } - compileClasspath += transform.output - } - mod { - groovy { - compileClasspath += extension.output - } - compileClasspath += transform.output - compileClasspath += configurations.getByName('minecraft') - } -} - -// GML is written in pure Groovy, so delete the empty java folder in each of the sourceSets -sourceSets.each { sourceSet -> - final javaDir = file("src/${sourceSet.name}/java/") - javaDir.deleteDir() -} \ No newline at end of file diff --git a/gradle/publishing.gradle b/gradle/publishing.gradle deleted file mode 100644 index 46206b1..0000000 --- a/gradle/publishing.gradle +++ /dev/null @@ -1,152 +0,0 @@ -import groovy.transform.CompileStatic -import org.w3c.dom.Document -import org.w3c.dom.Element - -modrinth { - token = findProperty('modrinthToken') ?: System.getenv('MODRINTH_TOKEN') - projectId = project.modrinth_project - versionNumber = project.version - versionType = project.ext.versionBasedReleaseType - uploadFile = tasks.fullJar - gameVersions = [mc_version] - loaders = ['forge'] - changelog.set(tasks.changelog.output.map { - it.asFile.text - }) -} -tasks.named('modrinth') { - dependsOn(tasks.fullJar, tasks.changelog) -} - -publishCurseForge { - apiToken = findProperty('curseforgeKey') ?: System.getenv('CURSEFORGE_TOKEN') - group = 'publishing' - disableVersionDetection() - - final projectId = findProperty('curseforge_project') - final modFile = upload(projectId, tasks.fullJar) - modFile.changelog = tasks.changelog.output.asFile.get() - modFile.releaseType = project.ext.versionBasedReleaseType - modFile.displayName = "$archivesBaseName-$version" as String - modFile.addJavaVersion 'Java 17' - modFile.addModLoader 'Forge' - modFile.addGameVersion "$mc_version" - - dependsOn(tasks.fullJar) - finalizedBy(':makeReadme') -} - -nexusPublishing { - repositories { - sonatype { - username.set(System.getenv('SONATYPE_USER') ?: '') - password.set(System.getenv('SONATYPE_PASSWORD') ?: '') - nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/")) - } - } -} - -def sharedMetadata(MavenPom it) { - it.packaging = 'jar' - it.url = 'https://github.com/GroovyMC/GroovyModLoader' - it.inceptionYear = '2022' - it.licenses { - license { - name = 'MIT' - url = 'https://opensource.org/license/mit/' - } - } - it.developers { - developer { - id = 'groovymc' - name = 'GroovyMC' - email = 'holdings@groovymc.org' - url = 'https://github.com/GroovyMC/' - } - } - it.scm { - connection='scm:git:git://github.com/GroovyMC/GroovyModLoader.git' - url='https://github.com/GroovyMC/GroovyModLoader' - } -} - -publishing { - publications { - register('mavenJava', MavenPublication) { - it.artifacts = [ - jar, sourcesJar, fullJar, groovydocJar - ] - it.artifactId = 'gml' - changelog.addArtifact(it) - - pom { - name = 'GML' - description = 'A language provider for Forge mods for Groovy' - sharedMetadata(it) - withXml { XmlProvider xml -> - final element = xml.asElement() - var depsElem = element.getOwnerDocument().createElement('dependencies') - var owner = element.getOwnerDocument() - var deps = (DependencySet) project.configurations.groovy.getDependencies() - deps.each { - depsElem.appendChild createDependency(owner, it.group, it.name, it.version, 'compile') - } - depsElem.appendChild createDependency(owner, project.group, 'transform', project.version, 'compile') - element.appendChild(depsElem) - } - } - } - register('transform', MavenPublication) { - it.artifactId = 'transform' - it.artifacts = [transformJar, transformSources, transformJavadocJar] - pom { - name = 'GML - Transform' - description = 'Compile-time transforms for GML' - sharedMetadata(it) - withXml { XmlProvider xml -> - final element = xml.asElement() - var depsElem = element.getOwnerDocument().createElement('dependencies') - var owner = element.getOwnerDocument() - var deps = (DependencySet) project.configurations.groovy.getDependencies() - deps.each { - depsElem.appendChild createDependency(owner, it.group, it.name, it.version, 'compile') - } - element.appendChild(depsElem) - } - } - } - } -} - -if (System.getenv('SONATYPE_USER')) { - signing { - final signingKey = System.getenv('SIGNING_KEY') ?: '' - final signingPassword = System.getenv('SIGNING_PASSWORD') ?: '' - useInMemoryPgpKeys(signingKey, signingPassword) - sign publishing.publications.mavenJava - sign publishing.publications.transform - } -} - -@CompileStatic -static Element createDependency(Document owner, String group, String name, String version, String scope) { - var sub = owner.createElement('dependency') - - var groupEl = owner.createElement('groupId') - groupEl.appendChild(owner.createTextNode(group)) - sub.appendChild groupEl - - var artEl = owner.createElement('artifactId') - artEl.appendChild(owner.createTextNode(name)) - sub.appendChild artEl - - var verEl = owner.createElement('version') - verEl.appendChild(owner.createTextNode(version)) - sub.appendChild verEl - - var scopeEl = owner.createElement('scope') - scopeEl.appendChild(owner.createTextNode(scope)) - sub.appendChild scopeEl - - return sub -} \ No newline at end of file diff --git a/script-mods/build.gradle b/script-mods/build.gradle index 94acf4c..19d7c5b 100644 --- a/script-mods/build.gradle +++ b/script-mods/build.gradle @@ -27,7 +27,7 @@ dependencies { implementation 'cpw.mods:securejarhandler:2.1.4' implementation 'net.minecraftforge:forgespi:6.0.0' implementation 'com.electronwill.night-config:toml:3.6.4' - implementation "org.apache.groovy:groovy:${groovy_version}" + implementation "org.groovymc:groovybundler:${project.groovybundler_version}" implementation "net.neoforged.fancymodloader:loader:${fml_version}" shadow('com.google.jimfs:jimfs:1.2') {