Gradle plugin with 1-line initialization of all buildscript dependencies and plugins

This commit is contained in:
Andrew Golovashevich 2024-11-09 00:42:17 +03:00
parent a5598155e5
commit f27b81dcdd
8 changed files with 144 additions and 11 deletions

55
embed/build.gradle.kts Normal file
View File

@ -0,0 +1,55 @@
import java.util.Properties
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts
buildscript {
val versions = java.util.Properties()
versions.load(rootDir.resolve("../versions.properties").inputStream())
dependencies {
classpath("ru.landgrafhomyak.kotlin:kotlin-mpp-gradle-build-helper:v${versions.getProperty("this")}k${versions.getProperty("kotlin")}")
}
}
plugins {
kotlin("multiplatform") version "2.0.20"
`maven-publish`
}
val versions = Properties()
versions.load(rootDir.resolve("../versions.properties").inputStream())
val targetKotlinVersion = versions.getProperty("kotlin")
group = "ru.landgrafhomyak.kotlin"
version = "v${versions.getProperty("this")}k${targetKotlinVersion}"
repositories {
mavenCentral()
}
kotlin {
optInContracts()
jvmToolchain(8)
jvm()
sourceSets {
jvmMain {
dependencies {
compileOnly("dev.gradleplugins:gradle-api:${versions.getProperty("gradle")}")
implementation("${group}:kotlin-mpp-gradle-build-helper:${targetKotlinVersion}")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${targetKotlinVersion}")
}
}
}
}
publishing {
repositories {
defineXomrkGiteaMavenRepo()
}
}

View File

@ -0,0 +1,2 @@
rootProject.name = "kotlin-mpp-gradle-build"

View File

@ -0,0 +1,19 @@
package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper
import org.gradle.api.Plugin
import org.gradle.api.Project
class SetupBuildScript : Plugin<Project> {
override fun apply(project: Project) {
project.extensions.add("xomrk", XomrkDsl(project))
}
internal object PluginIDs {
@JvmStatic
val THIS = "ru.landgrafhomyak.kotlin.original-multiplatform-ext"
@JvmStatic
val KOTLIN_MULTIPLATFORM = "org.jetbrains.kotlin.multiplatform"
}
}

View File

@ -0,0 +1,37 @@
package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import kotlin.reflect.KClass
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.SetupBuildScript.PluginIDs
open class XomrkDsl internal constructor(private val project: Project) {
@Suppress("FunctionName")
private fun <T : Any> _wrapExtension(
@Suppress("SameParameterValue") pluginId: String,
extensionClass: KClass<T>,
config: T.() -> Unit
) {
contract {
callsInPlace(config, InvocationKind.EXACTLY_ONCE)
}
if (null == this.project.plugins.findPlugin(pluginId)) {
this.project.plugins.apply(pluginId)
}
val dsl = this.project.extensions.findByType(extensionClass.java) ?: throw RuntimeException("Can't get extension")
config(dsl)
}
fun kotlin(config: KotlinMultiplatformExtension.() -> Unit) {
contract {
callsInPlace(config, InvocationKind.EXACTLY_ONCE)
}
this._wrapExtension(PluginIDs.KOTLIN_MULTIPLATFORM, KotlinMultiplatformExtension::class, config)
}
}

View File

@ -0,0 +1,20 @@
package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import org.gradle.api.Project
@Suppress("unused")
fun Project.xomrk(config: XomrkDsl.() -> Unit) {
contract {
callsInPlace(config, InvocationKind.EXACTLY_ONCE)
}
if (null == this.plugins.findPlugin(SetupBuildScript::class.java)) {
this.plugins.apply(SetupBuildScript::class.java)
}
val dsl = this.extensions.findByType(XomrkDsl::class.java) ?: throw RuntimeException("Can't install helper plugin")
config(dsl)
}

View File

@ -0,0 +1 @@
implementation-class=ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.SetupBuildScript

View File

@ -1,2 +1,3 @@
includeBuild("impl")
includeBuild("embed")
includeBuild("test")

View File

@ -1,6 +1,7 @@
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineAllMultiplatformTargets
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts
import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.xomrk
buildscript {
val versions = java.util.Properties()
@ -12,22 +13,19 @@ buildscript {
}
dependencies {
classpath("ru.landgrafhomyak.kotlin:kotlin-mpp-gradle-build-helper:v${versions.getProperty("this")}k${versions.getProperty("kotlin")}")
classpath("ru.landgrafhomyak.kotlin:kotlin-mpp-gradle-build:v${versions.getProperty("this")}k${versions.getProperty("kotlin")}")
}
}
plugins {
kotlin("multiplatform") version "2.0.20"
}
repositories {
mavenCentral()
defineXomrkGiteaMavenRepo()
}
kotlin {
jvmToolchain(8)
defineAllMultiplatformTargets()
optInContracts()
}
xomrk {
kotlin {
jvmToolchain(8)
defineAllMultiplatformTargets()
optInContracts()
}
}