diff --git a/build.gradle.kts b/build.gradle.kts index 2fe55d5..aaa17f4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { `kotlin-dsl` kotlin("plugin.serialization") version "1.6.21" @@ -33,22 +31,22 @@ gradlePlugin { implementationClass = "lgbt.mystic.foundation.concrete.ConcreteRootPlugin" } - create("concrete-project") { - id = "lgbt.mystic.foundation.concrete-project" + create("concrete-plugin") { + id = "lgbt.mystic.foundation.concrete-plugin" implementationClass = "lgbt.mystic.foundation.concrete.ConcreteProjectPlugin" } } } java { - val version = JavaVersion.toVersion("1.8") + val version = JavaVersion.toVersion("11") sourceCompatibility = version targetCompatibility = version } -tasks.withType { +tasks.compileKotlin { kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "11" } } diff --git a/sample/hello-world/build.gradle.kts b/sample/hello-world/build.gradle.kts index 0c3aca3..af92cdf 100644 --- a/sample/hello-world/build.gradle.kts +++ b/sample/hello-world/build.gradle.kts @@ -1,3 +1,3 @@ plugins { - id("lgbt.mystic.foundation.concrete-project") + id("lgbt.mystic.foundation.concrete-plugin") } diff --git a/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteProjectPlugin.kt b/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteProjectPlugin.kt index 2e66842..3a5ab5a 100644 --- a/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteProjectPlugin.kt +++ b/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteProjectPlugin.kt @@ -1,11 +1,9 @@ package lgbt.mystic.foundation.concrete -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.tasks.compile.JavaCompile import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.repositories @@ -36,7 +34,7 @@ class ConcreteProjectPlugin : Plugin { } } - val paperApiVersion = project.rootProject.extensions.getByType().paperApiVersion.get() + val paperApiVersion = project.concreteRootExtension.paperApiVersion.get() project.dependencies.add("compileOnly", "io.papermc.paper:paper-api:${paperApiVersion}") @@ -55,7 +53,7 @@ class ConcreteProjectPlugin : Plugin { } } - (project.tasks["shadowJar"] as ShadowJar).apply { + project.shadowJarTask!!.apply { archiveClassifier.set("plugin") } @@ -69,6 +67,6 @@ class ConcreteProjectPlugin : Plugin { } } - project.rootProject.tasks["setupPaperServer"].dependsOn(project.tasks["shadowJar"]) + project.concreteRootProject.tasks["setupPaperServer"].dependsOn(project.tasks["shadowJar"]) } } diff --git a/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteRootPlugin.kt b/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteRootPlugin.kt index 0c04a14..e17518d 100644 --- a/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteRootPlugin.kt +++ b/src/main/kotlin/lgbt/mystic/foundation/concrete/ConcreteRootPlugin.kt @@ -7,7 +7,7 @@ import org.gradle.kotlin.dsl.create class ConcreteRootPlugin : Plugin { override fun apply(project: Project) { - project.apply(plugin = "java") + project.apply(plugin = "base") project.extensions.create("concrete") val setupPaperServer = project.tasks.create("setupPaperServer") val runPaperServer = project.tasks.create("runPaperServer") diff --git a/src/main/kotlin/lgbt/mystic/foundation/concrete/PaperVersionClient.kt b/src/main/kotlin/lgbt/mystic/foundation/concrete/PaperVersionClient.kt index 9a62ef3..d2ea7c8 100644 --- a/src/main/kotlin/lgbt/mystic/foundation/concrete/PaperVersionClient.kt +++ b/src/main/kotlin/lgbt/mystic/foundation/concrete/PaperVersionClient.kt @@ -7,7 +7,7 @@ import java.net.http.HttpRequest import java.net.http.HttpResponse class PaperVersionClient( - val client: HttpClient = HttpClient.newHttpClient(), + private val client: HttpClient = HttpClient.newHttpClient(), private val gson: Gson = Globals.gson ) { private val apiBaseUrl = URI.create("https://papermc.io/api/v2/") diff --git a/src/main/kotlin/lgbt/mystic/foundation/concrete/SetupPaperServer.kt b/src/main/kotlin/lgbt/mystic/foundation/concrete/SetupPaperServer.kt index 65a5cc7..2b309bb 100644 --- a/src/main/kotlin/lgbt/mystic/foundation/concrete/SetupPaperServer.kt +++ b/src/main/kotlin/lgbt/mystic/foundation/concrete/SetupPaperServer.kt @@ -1,6 +1,5 @@ package lgbt.mystic.foundation.concrete -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.DefaultTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction @@ -45,7 +44,7 @@ open class SetupPaperServer : DefaultTask() { continue } - val task = project.tasks.getByName("shadowJar") as ShadowJar + val task = project.shadowJarTask!! val pluginJarFile = task.outputs.files.first() val pluginLinkFile = paperPluginsDirectory.resolve("${project.name}.jar") pluginLinkFile.delete() diff --git a/src/main/kotlin/lgbt/mystic/foundation/concrete/UpdateManifestTask.kt b/src/main/kotlin/lgbt/mystic/foundation/concrete/UpdateManifestTask.kt index aeaaeb4..eaebf7b 100644 --- a/src/main/kotlin/lgbt/mystic/foundation/concrete/UpdateManifestTask.kt +++ b/src/main/kotlin/lgbt/mystic/foundation/concrete/UpdateManifestTask.kt @@ -12,7 +12,7 @@ open class UpdateManifestTask : DefaultTask() { val updateFile = manifestsDir.resolve("update.json") val rootPath = project.rootProject.rootDir.toPath() val updateManifest = project.findPluginProjects().mapNotNull { project -> - val paths = project.shadowJarOutputs.allFilesRelativeToPath(rootPath) + val paths = project.shadowJarOutputs!!.allFilesRelativeToPath(rootPath) if (paths.isNotEmpty()) { project.name to mapOf( "version" to project.version, diff --git a/src/main/kotlin/lgbt/mystic/foundation/concrete/extensions.kt b/src/main/kotlin/lgbt/mystic/foundation/concrete/extensions.kt index 273ad88..5f2eb40 100644 --- a/src/main/kotlin/lgbt/mystic/foundation/concrete/extensions.kt +++ b/src/main/kotlin/lgbt/mystic/foundation/concrete/extensions.kt @@ -1,16 +1,51 @@ package lgbt.mystic.foundation.concrete +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.Project import org.gradle.api.tasks.TaskOutputs import java.nio.file.FileSystems import java.nio.file.Path -fun Project.isPluginProject() = project.tasks.names.contains("shadowJar") -fun Project.findPluginProjects() = rootProject.allprojects.filter { project -> project.isPluginProject() } +internal fun Project.isPluginProject() = plugins.hasPlugin(ConcreteProjectPlugin::class.java) +internal fun Project.findPluginProjects() = allprojects.filter { project -> project.isPluginProject() } -val Project.shadowJarOutputs: TaskOutputs - get() = project.tasks.getByName("shadowJar").outputs +internal val Project.shadowJarTask: ShadowJar? + get() = + if (project.tasks.names.contains("shadowJar")) + project.tasks.getByName("shadowJar") as ShadowJar + else null -fun TaskOutputs.allFilesRelativeToPath(root: Path): List = files.map { root.relativize(it.toPath()) } +internal val Project.shadowJarOutputs: TaskOutputs? + get() = shadowJarTask?.outputs -fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/") +internal val Project.concreteRootExtension: ConcreteExtension + get() { + val direct = extensions.findByType(ConcreteExtension::class.java) + if (direct != null) { + return direct + } + + if (parent != null) { + return parent!!.concreteRootExtension + } + + throw RuntimeException("Failed to find concrete extension. Did you apply the concrete root plugin?") + } + +internal val Project.concreteRootProject: Project + get() { + val direct = extensions.findByType(ConcreteExtension::class.java) + if (direct != null) { + return this + } + + if (parent != null) { + return parent!! + } + + throw RuntimeException("Failed to find concrete root. Did you apply the concrete root plugin?") + } + +internal fun TaskOutputs.allFilesRelativeToPath(root: Path): List = files.map { root.relativize(it.toPath()) } + +internal fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/")