Skip to content

Commit 524e541

Browse files
committed
Refactor SPM Plugin for more code reuse and addressing other code review comments
1 parent 6629cd0 commit 524e541

10 files changed

Lines changed: 92 additions & 114 deletions

File tree

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*/
1313
plugins {
1414
alias(libs.plugins.kotlin) apply false
15-
id("org.jetbrains.kotlin.plugin.allopen") version "1.9.0" apply false
15+
alias(libs.plugins.allopen) apply false
1616
alias(libs.plugins.maven.publish) apply false
1717
id("org.jlleitschuh.gradle.ktlint") version "12.2.0" apply false
1818
}
@@ -50,4 +50,4 @@ subprojects {
5050
dependsOn(tasks.getByName("ktlintCheck"))
5151
}
5252
}
53-
}
53+
}

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api
1010

1111
[plugins]
1212
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
13+
allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin" }
1314
maven-publish = { id = "com.vanniktech.maven.publish.base", version.ref = "mavenPublish" }
1415

kmmbridge-github/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
plugins {
1717
`kotlin-dsl`
1818
alias(libs.plugins.kotlin)
19-
id("org.jetbrains.kotlin.plugin.allopen")
19+
alias(libs.plugins.allopen)
2020
id("java-gradle-plugin")
2121
alias(libs.plugins.maven.publish)
2222
id("com.gradle.plugin-publish") version "1.0.0"

kmmbridge-gitlab/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
plugins {
1717
`kotlin-dsl`
1818
alias(libs.plugins.kotlin)
19-
id("org.jetbrains.kotlin.plugin.allopen")
19+
alias(libs.plugins.allopen)
2020
id("java-gradle-plugin")
2121
alias(libs.plugins.maven.publish)
2222
id("com.gradle.plugin-publish") version "1.0.0"

kmmbridge-test/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
plugins {
1717
`kotlin-dsl`
1818
alias(libs.plugins.kotlin)
19-
id("org.jetbrains.kotlin.plugin.allopen")
19+
alias(libs.plugins.allopen)
2020
id("java-gradle-plugin")
2121
alias(libs.plugins.maven.publish)
2222
id("com.gradle.plugin-publish") version "1.0.0"

kmmbridge/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
plugins {
1717
`kotlin-dsl`
1818
alias(libs.plugins.kotlin)
19-
id("org.jetbrains.kotlin.plugin.allopen")
19+
alias(libs.plugins.allopen)
2020
id("java-gradle-plugin")
2121
alias(libs.plugins.maven.publish)
2222
id("com.gradle.plugin-publish") version "1.0.0"

kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KMMBridge.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFrameworkConfig
4646
open class KMMBridgePlugin : BaseKMMBridgePlugin()
4747

4848
abstract class BaseKMMBridgePlugin : Plugin<Project> {
49+
companion object {
50+
internal const val PUBLISH_TASK_NAME = "kmmBridgePublish"
51+
}
52+
4953
override fun apply(project: Project): Unit = with(project) {
5054
val extension = extensions.create<KmmBridgeExtension>(EXTENSION_NAME)
5155

@@ -141,7 +145,7 @@ abstract class BaseKMMBridgePlugin : Plugin<Project> {
141145

142146
// Publish task depends on the upload task
143147
val publishRemoteTask =
144-
tasks.register("kmmBridgePublish") {
148+
tasks.register(PUBLISH_TASK_NAME) {
145149
description = "Publishes your framework. Uses your KMMBridge block configured in the build gradle to determine details."
146150
group = TASK_GROUP_NAME
147151
dependsOn(uploadTask)

kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/SpmDependencyManager.kt

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ package co.touchlab.kmmbridge.dependencymanager
1515

1616
import co.touchlab.kmmbridge.TASK_GROUP_NAME
1717
import co.touchlab.kmmbridge.dsl.TargetPlatformDsl
18-
import co.touchlab.kmmbridge.spm.SpmModuleMetadata
1918
import co.touchlab.kmmbridge.internal.domain.SwiftToolVersion
20-
import co.touchlab.kmmbridge.internal.domain.TargetPlatform
2119
import co.touchlab.kmmbridge.internal.domain.konanTarget
2220
import co.touchlab.kmmbridge.internal.domain.swiftPackagePlatformName
2321
import co.touchlab.kmmbridge.internal.findXCFrameworkAssembleTask
2422
import co.touchlab.kmmbridge.internal.kmmBridgeExtension
2523
import co.touchlab.kmmbridge.internal.kotlin
2624
import co.touchlab.kmmbridge.internal.layoutBuildDir
25+
import co.touchlab.kmmbridge.internal.spmKmmBridgeExtensionOrNull
2726
import co.touchlab.kmmbridge.internal.urlFile
2827
import co.touchlab.kmmbridge.internal.zipFilePath
28+
import co.touchlab.kmmbridge.spm.SpmModuleMetadata
2929
import java.io.ByteArrayOutputStream
3030
import java.io.File
3131
import java.nio.charset.Charset
@@ -102,11 +102,12 @@ internal class SpmDependencyManager(
102102
val zipFile = project.zipFilePath()
103103
val urlFile = project.urlFile
104104
val metadataFile = File(project.layout.buildDirectory.asFile.get(), SpmModuleMetadata.METADATA_FILE_NAME)
105-
val platformsMap = parsePlatformsMap(project)
106105

107106
inputs.files(zipFile, urlFile)
108107
outputs.file(metadataFile)
109108

109+
dependsOn(uploadTask)
110+
110111
@Suppress("ObjectLiteralToLambda")
111112
doLast(
112113
object : Action<Task> {
@@ -118,8 +119,8 @@ internal class SpmDependencyManager(
118119
frameworkName = packageName,
119120
url = url,
120121
checksum = checksum,
121-
platforms = platformsMap,
122-
swiftToolsVersion = swiftToolVersion.name
122+
platforms = parsePlatformsMap(project),
123+
swiftToolsVersion = swiftToolVersion.name,
123124
)
124125

125126
metadata.writeToFile(metadataFile)
@@ -129,8 +130,6 @@ internal class SpmDependencyManager(
129130
)
130131
}
131132

132-
writeMetadataTask.configure { dependsOn(uploadTask) }
133-
134133
val updatePackageSwiftTask =
135134
project.tasks.register("updatePackageSwift") {
136135
group = TASK_GROUP_NAME
@@ -248,7 +247,7 @@ internal class SpmDependencyManager(
248247
if (useCustomPackageFile) return // No local dev when using a custom package file
249248

250249
// Skip if root SPM plugin is applied (use spmDevBuildAll instead)
251-
val rootHasSpmPlugin = project.rootProject.extensions.findByName("kmmBridgeSpm") != null
250+
val rootHasSpmPlugin = project.rootProject.spmKmmBridgeExtensionOrNull != null
252251
if (rootHasSpmPlugin) return
253252

254253
val extension = project.kmmBridgeExtension
@@ -286,36 +285,16 @@ internal class SpmDependencyManager(
286285
}
287286

288287
private fun swiftTargetPlatforms(project: Project): String {
289-
val targetPlatforms =
290-
TargetPlatformDsl()
291-
.apply(_targetPlatforms)
292-
.targetPlatforms
293-
.ifEmpty {
294-
throw IllegalArgumentException("At least one target platform should be specified!")
295-
}
296-
297-
val platforms = platforms(project, targetPlatforms)
298-
return platforms
288+
return parsePlatformsMap(project)
289+
.map { (platformName, platformVersion) -> ".$platformName(.v${platformVersion})" }
290+
.joinToString(separator = ",\n")
299291
}
300292

301-
private fun platforms(project: Project, targetPlatforms: List<TargetPlatform>): String = targetPlatforms
302-
.flatMap { platform ->
303-
project.kotlin.targets
304-
.withType<KotlinNativeTarget>()
305-
.asSequence()
306-
.filter { it.konanTarget.family.isAppleFamily }
307-
.filter { appleTarget -> platform.targets.firstOrNull { it.konanTarget == appleTarget.konanTarget } != null }
308-
.mapNotNull { it.konanTarget.family.swiftPackagePlatformName }
309-
.distinct()
310-
.map { platformName -> ".$platformName(.v${platform.version.name})" }
311-
.toList()
312-
}.joinToString(separator = ",\n")
313-
314293
/**
315294
* Parse platforms into a map for metadata JSON.
316295
* Returns a map like {"iOS": "15", "macOS": "15"}
317296
*/
318-
private fun parsePlatformsMap(project: Project): Map<String, String> {
297+
internal fun parsePlatformsMap(project: Project): Map<String, String> {
319298
val targetPlatforms = TargetPlatformDsl()
320299
.apply(_targetPlatforms)
321300
.targetPlatforms

kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/ProjectExtensionsInternal.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package co.touchlab.kmmbridge.internal
22

33
import co.touchlab.kmmbridge.KmmBridgeExtension
44
import co.touchlab.kmmbridge.findStringProperty
5+
import co.touchlab.kmmbridge.spm.KmmBridgeSpmExtension
56
import java.io.File
67
import org.gradle.api.Project
78
import org.gradle.api.Task
@@ -17,7 +18,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
1718
internal val Project.layoutBuildDir get() = layout.buildDirectory.get().asFile
1819

1920
internal val Project.kotlin: KotlinMultiplatformExtension get() = extensions.getByType()
21+
2022
internal val Project.kmmBridgeExtension get() = extensions.getByType<KmmBridgeExtension>()
23+
internal val Project.kmmBridgeExtensionOrNull get() = extensions.findByType<KmmBridgeExtension>()
24+
25+
internal val Project.spmKmmBridgeExtension get() = extensions.getByType<KmmBridgeSpmExtension>()
26+
internal val Project.spmKmmBridgeExtensionOrNull get() = extensions.findByType<KmmBridgeSpmExtension>()
2127

2228
internal val Project.urlFile get() = file("$layoutBuildDir/kmmbridge/url")
2329

0 commit comments

Comments
 (0)