Skip to content

Commit 7ec2b89

Browse files
KSP gradle plugin single target
1 parent 9394150 commit 7ec2b89

File tree

10 files changed

+120
-12
lines changed

10 files changed

+120
-12
lines changed

ksp/core-annotations/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
../../ksp-annotations/build
1+
build
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
POM_NAME=Ksp Processor
2-
POM_ARTIFACT_ID=ksp-processor
3-
POM_DESCRIPTION=The KSP routing processor
1+
POM_NAME=Ksp Core Annotations
2+
POM_ARTIFACT_ID=ksp-core-annotations
3+
POM_DESCRIPTION=Core annotations to generate basic behaviors

ksp/core-processor/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
../../ksp-processor/build
1+
build

ksp/core-processor/gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
POM_NAME=Ksp Processor
2-
POM_ARTIFACT_ID=ksp-processor
3-
POM_DESCRIPTION=The KSP routing processor
1+
POM_NAME=Ksp Core Processor
2+
POM_ARTIFACT_ID=ksp-core-processor
3+
POM_DESCRIPTION=Ksp core processor to generate basic behaviors

ksp/gradle-plugin/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
build

ksp/gradle-plugin/build.gradle.kts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import com.android.build.gradle.internal.tasks.factory.dependsOn
2+
3+
plugins {
4+
kotlin("jvm")
5+
id("java-gradle-plugin")
6+
id("com.gradle.plugin-publish") version "1.2.1"
7+
id("org.jetbrains.kotlinx.kover")
8+
alias(libs.plugins.maven.publish)
9+
}
10+
11+
dependencies {
12+
implementation(libs.plugin.kotlin)
13+
}
14+
15+
gradlePlugin {
16+
website.set("https://github.com/programadorthi/kotlin-routing")
17+
vcsUrl.set("https://github.com/programadorthi/kotlin-routing")
18+
19+
plugins {
20+
create("kotlin-routing-plugin") {
21+
id = "dev.programadorthi.routing"
22+
implementationClass = "dev.programadorthi.routing.gradle.KotlinRoutingGradlePlugin"
23+
displayName = "Kotlin Routing Gradle Plugin"
24+
description = "Gradle Plugin for Kotlin Routing"
25+
tags.set(listOf("router", "kotlin", "kotlin-mpp", "ktor", "routing", "navigation"))
26+
}
27+
}
28+
}
29+
30+
val versionRegister = tasks.register<Exec>("version-register") {
31+
commandLine(
32+
"find", "./src",
33+
"-type", "f",
34+
"-exec",
35+
"sed", "-i",
36+
"''", """s/<version>/${providers.gradleProperty("version").get()}/g""",
37+
"{}", "+"
38+
)
39+
}
40+
41+
tasks.named("processResources").dependsOn(versionRegister)

ksp/gradle-plugin/gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
POM_NAME=Ksp Gradle Plugin
2+
POM_ARTIFACT_ID=ksp-gradle-plugin
3+
POM_DESCRIPTION=The KSP Gradle Plugin
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package dev.programadorthi.routing.gradle
2+
3+
import org.gradle.api.Plugin
4+
import org.gradle.api.Project
5+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
6+
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension
7+
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
8+
import java.util.Locale
9+
10+
class KotlinRoutingGradlePlugin : Plugin<Project> {
11+
override fun apply(target: Project) {
12+
with(target) {
13+
checkNotNull(plugins.findPlugin("com.google.devtools.ksp")) {
14+
"KSP plugin not found. Please, apply ksp plugin before routing plugin"
15+
}
16+
17+
val kex = kotlinExtension
18+
if (kex is KotlinSingleTargetExtension<*>) {
19+
dependencies.add("implementation", ANNOTATIONS)
20+
dependencies.add("ksp", PROCESSOR)
21+
return@with
22+
}
23+
24+
if (kex is KotlinMultiplatformExtension) {
25+
kex.targets.configureEach { kTarget ->
26+
kTarget.compilations.configureEach { compilation ->
27+
println(">>>> $kTarget -> $compilation")
28+
}
29+
if (kTarget.platformType.name == "common") {
30+
dependencies.add("kspCommonMainMetadata", PROCESSOR)
31+
return@configureEach
32+
}
33+
val capitalizedTargetName =
34+
kTarget.targetName.replaceFirstChar {
35+
if (it.isLowerCase()) {
36+
it.titlecase(Locale.US)
37+
} else {
38+
it.toString()
39+
}
40+
}
41+
dependencies.add("ksp$capitalizedTargetName", PROCESSOR)
42+
43+
if (kTarget.compilations.any { it.name == "test" }) {
44+
dependencies.add("ksp${capitalizedTargetName}Test", PROCESSOR)
45+
}
46+
}
47+
}
48+
}
49+
}
50+
51+
private companion object {
52+
// Version will be replaced by Gradle Exec Task
53+
private const val ANNOTATIONS = "dev.programadorthi.routing:ksp-core-annotations:<version>"
54+
private const val PROCESSOR = "dev.programadorthi.routing:ksp-core-processor:<version>"
55+
}
56+
}

samples/ksp-sample/build.gradle.kts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
plugins {
2-
alias(libs.plugins.ksp)
32
kotlin("jvm")
3+
alias(libs.plugins.ksp)
4+
//id("dev.programadorthi.routing") version "0.0.99"
45
}
56

67
dependencies {
78
implementation(projects.core)
8-
implementation(projects.ksp.coreAnnotations)
9-
implementation(projects.ksp.coreProcessor)
10-
ksp(projects.ksp.coreProcessor)
9+
}
10+
11+
configurations.all {
12+
resolutionStrategy.dependencySubstitution {
13+
substitute(module("dev.programadorthi.routing:core"))
14+
.using(project(":core"))
15+
.because("KSP gradle plugin have maven central dependencies")
16+
}
1117
}

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ include(":events")
2727
include(":events-resources")
2828
include(":ksp:core-annotations")
2929
include(":ksp:core-processor")
30+
include(":ksp:gradle-plugin")
3031
include(":resources")
3132
include(":sessions")
3233
include(":status-pages")

0 commit comments

Comments
 (0)