diff --git a/buildSrc/src/main/kotlin/gradle-plugin.gradle.kts b/buildSrc/src/main/kotlin/gradle-plugin.gradle.kts new file mode 100644 index 0000000..d35ba6f --- /dev/null +++ b/buildSrc/src/main/kotlin/gradle-plugin.gradle.kts @@ -0,0 +1,16 @@ +import gradle.kotlin.dsl.accessors._3446ec0516f3690bb745eb6b3e74e05f.signing +import publishing.trySignAll + +plugins { + id("com.gradle.plugin-publish") + `java-gradle-plugin` + `maven-publish` + signing +} + +dependencies { + compileOnly(gradleKotlinDsl()) +} + +java { withSourcesJar() } +signing { trySignAll() } diff --git a/gradle-plugins/settings-include-dsl/build.gradle.kts b/gradle-plugins/settings-include-dsl/build.gradle.kts new file mode 100644 index 0000000..60420ae --- /dev/null +++ b/gradle-plugins/settings-include-dsl/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + `gradle-plugin` + `kotlin-dsl` +} + +group = "org.splitties.incubator" + +gradlePlugin { + plugins { + create(project.name) { + id = "org.splitties.incubator.settings-include-dsl" + displayName = "Settings include DSL" + description = "For Gradle projects with nested modules where you call include a lot." + implementationClass = "org.splitties.incubator.gradle.SettingsIncludeDslPlugin" + } + } +} + +kotlin { + jvmToolchain(8) +} + +pluginBundle { + website = "https://github.com/LouisCAD/LibPublishingHelpers" + vcsUrl = "https://github.com/LouisCAD/LibPublishingHelpers.git" + tags = listOf("kotlin-dsl", "kotlin") +} diff --git a/gradle-plugins/settings-include-dsl/src/main/kotlin/ModuleParentScope.kt b/gradle-plugins/settings-include-dsl/src/main/kotlin/ModuleParentScope.kt new file mode 100644 index 0000000..6f5cdbc --- /dev/null +++ b/gradle-plugins/settings-include-dsl/src/main/kotlin/ModuleParentScope.kt @@ -0,0 +1,29 @@ +package org.splitties.incubator.gradle + +import org.gradle.api.initialization.Settings + +class ModuleParentScope( + private val settings: Settings, + private val name: String, + private val parent: ModuleParentScope? = null +) { + + operator fun String.invoke(block: (ModuleParentScope.() -> Unit)? = null) { + check(startsWith(':').not()) + val moduleName = ":$this" + val projectName = "$parentalPath$moduleName" + settings.include(projectName) + block?.let { buildNode -> + ModuleParentScope( + settings = settings, + name = moduleName, + parent = this@ModuleParentScope + ).buildNode() + } + } + + private val parentalPath: String = + generateSequence(this) { it.parent } + .map { it.name }.toList().reversed().joinToString("") + +} diff --git a/gradle-plugins/settings-include-dsl/src/main/kotlin/SettingsIncludeDslPlugin.kt b/gradle-plugins/settings-include-dsl/src/main/kotlin/SettingsIncludeDslPlugin.kt new file mode 100644 index 0000000..3b858f7 --- /dev/null +++ b/gradle-plugins/settings-include-dsl/src/main/kotlin/SettingsIncludeDslPlugin.kt @@ -0,0 +1,8 @@ +package org.splitties.incubator.gradle + +import org.gradle.api.Plugin +import org.gradle.api.initialization.Settings + +class SettingsIncludeDslPlugin : Plugin { + override fun apply(target: Settings) = Unit +} diff --git a/gradle-plugins/settings-include-dsl/src/main/kotlin/org/gradle/kotlin/dsl/include.kt b/gradle-plugins/settings-include-dsl/src/main/kotlin/org/gradle/kotlin/dsl/include.kt new file mode 100644 index 0000000..c752693 --- /dev/null +++ b/gradle-plugins/settings-include-dsl/src/main/kotlin/org/gradle/kotlin/dsl/include.kt @@ -0,0 +1,8 @@ +package org.gradle.kotlin.dsl + +import org.gradle.api.initialization.Settings +import org.splitties.incubator.gradle.ModuleParentScope + +inline fun Settings.include(block: ModuleParentScope.() -> Unit) { + ModuleParentScope(settings = this, name = "").block() +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 217ad22..57df47a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,4 @@ rootProject.name = "LibPublishingHelpers" -include("lib-publishing-helpers") dependencyResolutionManagement { repositories { @@ -12,3 +11,40 @@ val versionOfThisProject: String = file("version.txt").bufferedReader().use { it gradle.beforeProject { version = versionOfThisProject } + +include { + "lib-publishing-helpers"() + "gradle-plugins" { + "settings-include-dsl"() + } +} + +//region include DSL +class ModuleParentScope( + private val name: String, + private val parent: ModuleParentScope? = null +) { + + operator fun String.invoke(block: (ModuleParentScope.() -> Unit)? = null) { + check(startsWith(':').not()) + val moduleName = ":$this" + val projectName = "$parentalPath$moduleName" + include(projectName) + block?.let { buildNode -> + ModuleParentScope( + name = moduleName, + parent = this@ModuleParentScope + ).buildNode() + } + } + + private val parentalPath: String = + generateSequence(this) { it.parent } + .map { it.name }.toList().reversed().joinToString("") + +} + +inline fun include(block: ModuleParentScope.() -> Unit) { + ModuleParentScope("").block() +} +//endregion