diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts new file mode 100644 index 00000000..c0d99865 --- /dev/null +++ b/build-logic/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} + +dependencies { + // version must be manually kept in sync with the one in root project settings.gradle.kts + implementation("gradle.plugin.com.github.jengelman.gradle.plugins", "shadow", "7.0.0") +} diff --git a/build-logic/src/main/kotlin/extensions.kt b/build-logic/src/main/kotlin/extensions.kt new file mode 100644 index 00000000..c55b057b --- /dev/null +++ b/build-logic/src/main/kotlin/extensions.kt @@ -0,0 +1,44 @@ +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.named +import java.io.ByteArrayOutputStream + +fun Project.publishShadowJar() { + configurePublication { + artifact(tasks["shadowJar"]) + artifact(tasks["sourcesJar"]) + } +} + +fun Project.publishJavaComponents() { + configurePublication { + from(components["java"]) + } +} + +private fun Project.configurePublication(configurer: MavenPublication.() -> Unit) { + extensions.configure { + publications.named("mavenJava") { + apply(configurer) + } + } +} + +fun Project.latestCommitHash(): String { + val byteOut = ByteArrayOutputStream() + exec { + commandLine = listOf("git", "rev-parse", "--short", "HEAD") + standardOutput = byteOut + } + return byteOut.toString(Charsets.UTF_8.name()).trim() +} + +fun JavaPluginExtension.javaTarget(version: Int) { + sourceCompatibility = JavaVersion.toVersion(version) + targetCompatibility = JavaVersion.toVersion(version) +} diff --git a/build-logic/src/main/kotlin/vb.base-conventions.gradle.kts b/build-logic/src/main/kotlin/vb.base-conventions.gradle.kts new file mode 100644 index 00000000..3b3471e5 --- /dev/null +++ b/build-logic/src/main/kotlin/vb.base-conventions.gradle.kts @@ -0,0 +1,42 @@ +plugins { + `java-library` + `maven-publish` +} + +tasks { + // Variable replacements + processResources { + filesMatching(listOf("plugin.yml", "mcmod.info", "fabric.mod.json", "bungee.yml")) { + expand("version" to project.version, "description" to project.description, "url" to "https://github.com/ViaVersion/ViaBackwards") + } + } + javadoc { + options.encoding = Charsets.UTF_8.name() + (options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet") + } + compileJava { + options.encoding = Charsets.UTF_8.name() + options.compilerArgs.addAll(listOf("-nowarn", "-Xlint:-unchecked", "-Xlint:-deprecation")) + } +} + +java { + javaTarget(8) + withSourcesJar() +} + +publishing { + publications.create("mavenJava") { + groupId = rootProject.group as String + artifactId = project.name + version = rootProject.version as String + } + repositories.maven { + name = "Via" + url = uri("https://repo.viaversion.com/") + credentials(PasswordCredentials::class) + authentication { + create("basic") + } + } +} diff --git a/build-logic/src/main/kotlin/vb.build-logic.gradle.kts b/build-logic/src/main/kotlin/vb.build-logic.gradle.kts new file mode 100644 index 00000000..e69de29b diff --git a/build-logic/src/main/kotlin/vb.platform-conventions.gradle.kts b/build-logic/src/main/kotlin/vb.platform-conventions.gradle.kts new file mode 100644 index 00000000..f6a99afb --- /dev/null +++ b/build-logic/src/main/kotlin/vb.platform-conventions.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("vb.shadow-conventions") +} + +tasks { + shadowJar { + archiveFileName.set("ViaBackwards-${project.name.substringAfter("viabackwards-").capitalize()}-${project.version}.jar") + destinationDirectory.set(rootProject.layout.buildDirectory.dir("libs")) + } +} diff --git a/build-logic/src/main/kotlin/vb.shadow-conventions.gradle.kts b/build-logic/src/main/kotlin/vb.shadow-conventions.gradle.kts new file mode 100644 index 00000000..77795eee --- /dev/null +++ b/build-logic/src/main/kotlin/vb.shadow-conventions.gradle.kts @@ -0,0 +1,29 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.jvm.tasks.Jar +import org.gradle.kotlin.dsl.named + +plugins { + id("vb.base-conventions") + id("com.github.johnrengelman.shadow") +} + +tasks { + named("jar") { + archiveClassifier.set("unshaded") + from(project.rootProject.file("LICENSE")) + } + val shadowJar = named("shadowJar") { + archiveClassifier.set("") + configureRelocations() + } + named("build") { + dependsOn(shadowJar) + } +} + +publishShadowJar() + +fun ShadowJar.configureRelocations() { + relocate("com.google.gson", "com.viaversion.viaversion.libs.gson") + relocate("it.unimi.dsi.fastutil", "com.viaversion.viaversion.libs.fastutil") +} diff --git a/build-logic/src/main/kotlin/vb.standard-conventions.gradle.kts b/build-logic/src/main/kotlin/vb.standard-conventions.gradle.kts new file mode 100644 index 00000000..b93b396d --- /dev/null +++ b/build-logic/src/main/kotlin/vb.standard-conventions.gradle.kts @@ -0,0 +1,5 @@ +plugins { + id("vb.base-conventions") +} + +publishJavaComponents() diff --git a/build.gradle.kts b/build.gradle.kts index 3e643bee..6255cb58 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,9 +1,6 @@ -import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin - plugins { - `java-library` - `maven-publish` - id("net.kyori.blossom") version "1.2.0" apply false + base + id("vb.build-logic") } allprojects { @@ -12,87 +9,23 @@ allprojects { description = "Allow older clients to join newer server versions." } -subprojects { - apply() - apply() - - tasks { - // Variable replacements - processResources { - filesMatching(listOf("plugin.yml", "mcmod.info", "fabric.mod.json", "bungee.yml")) { - expand("version" to project.version, - "description" to project.description, - "url" to "https://github.com/ViaVersion/ViaBackwards") - } - } - withType { - options.encoding = Charsets.UTF_8.name() - (options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet") - } - withType { - options.encoding = Charsets.UTF_8.name() - options.compilerArgs.addAll(listOf("-nowarn", "-Xlint:-unchecked", "-Xlint:-deprecation")) - } - } - - repositories { - maven("https://repo.viaversion.com") - maven("https://papermc.io/repo/repository/maven-public/") - maven("https://oss.sonatype.org/content/repositories/snapshots/") - maven("https://nexus.velocitypowered.com/repository/velocity-artifacts-snapshots/") - maven("https://repo.spongepowered.org/maven") - mavenCentral() - } - - java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - withSourcesJar() - withJavadocJar() - } -} - -// Configure shadow tasks before the publishing task -sequenceOf( +val platforms = setOf( projects.viabackwardsBukkit, projects.viabackwardsBungee, projects.viabackwardsFabric, projects.viabackwardsSponge, projects.viabackwardsVelocity -).map { it.dependencyProject }.forEach { project -> - project.configureShadowJar() -} +).map { it.dependencyProject } -projects.viabackwards.dependencyProject.apply() +// Would otherwise contain api/depdency modules if at some point needed +val special = setOf( + projects.viabackwards +).map { it.dependencyProject } subprojects { - publishing { - publications { - create("mavenJava") { - groupId = rootProject.group as String - artifactId = project.name - version = rootProject.version as String - - if (plugins.hasPlugin(ShadowPlugin::class.java)) { - artifact(tasks["shadowJar"]) - } else { - from(components["java"]) - } - } - } - repositories.maven { - name = "Via" - url = uri("https://repo.viaversion.com/") - credentials(PasswordCredentials::class) - authentication { - create("basic") - } - } - } -} - -tasks { - withType { - onlyIf { false } + when (this) { + in platforms -> plugins.apply("vb.platform-conventions") + in special -> plugins.apply("vb.base-conventions") + else -> plugins.apply("vb.standard-conventions") } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 7f236a57..00000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - gradlePluginPortal() -} - -dependencies { - implementation("com.github.jengelman.gradle.plugins", "shadow", "6.1.0") -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/extensions.kt b/buildSrc/src/main/kotlin/extensions.kt deleted file mode 100644 index 16238782..00000000 --- a/buildSrc/src/main/kotlin/extensions.kt +++ /dev/null @@ -1,45 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin -import org.gradle.api.Project -import org.gradle.jvm.tasks.Jar -import org.gradle.kotlin.dsl.apply -import org.gradle.kotlin.dsl.invoke -import org.gradle.kotlin.dsl.withType -import java.io.ByteArrayOutputStream - -fun Project.configureShadowJar() { - apply() - tasks { - withType { - archiveClassifier.set("") - archiveFileName.set("ViaBackwards-${project.name.substringAfter("viabackwards-").capitalize()}-${project.version}.jar") - destinationDirectory.set(rootProject.projectDir.resolve("build/libs")) - configureRelocations() - } - getByName("build") { - dependsOn(withType()) - } - withType { - if (name == "jar") { - archiveClassifier.set("unshaded") - } - from(project.parent!!.file("LICENSE")) { - into("") - } - } - } -} - -private fun ShadowJar.configureRelocations() { - relocate("com.google.gson", "com.viaversion.viaversion.libs.gson") - relocate("it.unimi.dsi.fastutil", "com.viaversion.viaversion.libs.fastutil") -} - -fun Project.latestCommitHash(): String { - val byteOut = ByteArrayOutputStream() - exec { - commandLine = listOf("git", "rev-parse", "--short", "HEAD") - standardOutput = byteOut - } - return byteOut.toString(Charsets.UTF_8.name()).trim() -} diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 30460105..5d73703f 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -12,4 +12,8 @@ dependencies { compileOnlyApi(libs.netty) compileOnlyApi(libs.guava) compileOnlyApi(libs.checkerQual) -} \ No newline at end of file +} + +java { + withJavadocJar() +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 2d2de557..9bd54f5a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,8 +1,29 @@ -rootProject.name = "viabackwards-parent" - enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("VERSION_CATALOGS") +rootProject.name = "viabackwards-parent" + +dependencyResolutionManagement { + repositories { + maven("https://repo.viaversion.com") + maven("https://papermc.io/repo/repository/maven-public/") + maven("https://oss.sonatype.org/content/repositories/snapshots/") + maven("https://nexus.velocitypowered.com/repository/velocity-artifacts-snapshots/") + maven("https://repo.spongepowered.org/maven") + mavenCentral() + } + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) +} + +pluginManagement { + plugins { + id("net.kyori.blossom") version "1.2.0" + id("com.github.johnrengelman.shadow") version "7.0.0" + } +} + +includeBuild("build-logic") + setupViaSubproject("common") setupViaSubproject("bukkit") setupViaSubproject("bungee") diff --git a/universal/build.gradle.kts b/universal/build.gradle.kts index 3efad525..9347643d 100644 --- a/universal/build.gradle.kts +++ b/universal/build.gradle.kts @@ -1,25 +1,41 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +plugins { + id("com.github.johnrengelman.shadow") +} + +val platforms = setOf( + projects.viabackwardsBukkit, + projects.viabackwardsBungee, + projects.viabackwardsFabric, + projects.viabackwardsSponge, + projects.viabackwardsVelocity +).map { it.dependencyProject } + tasks { - withType { + shadowJar { archiveClassifier.set("") archiveFileName.set("ViaBackwards-${project.version}.jar") destinationDirectory.set(rootProject.projectDir.resolve("build/libs")) duplicatesStrategy = DuplicatesStrategy.EXCLUDE - sequenceOf( - rootProject.projects.viabackwardsBukkit, - rootProject.projects.viabackwardsBungee, - rootProject.projects.viabackwardsFabric, - rootProject.projects.viabackwardsSponge, - rootProject.projects.viabackwardsVelocity, - ).map { it.dependencyProject }.forEach { subproject -> - val shadowJarTask = subproject.tasks.getByName("shadowJar", ShadowJar::class) + platforms.forEach { platform -> + val shadowJarTask = platform.tasks.getByName("shadowJar", ShadowJar::class) dependsOn(shadowJarTask) - dependsOn(subproject.tasks.withType()) + dependsOn(platform.tasks.withType()) from(zipTree(shadowJarTask.archiveFile)) } } build { - dependsOn(withType()) + dependsOn(shadowJar) + } + sourcesJar { + rootProject.subprojects.forEach { subproject -> + if (subproject == project) return@forEach + val platformSourcesJarTask = subproject.tasks.findByName("sourcesJar") as? Jar ?: return@forEach + dependsOn(platformSourcesJarTask) + from(zipTree(platformSourcesJarTask.archiveFile)) + } } } + +publishShadowJar()