From fd0cb37ce59b8b46621eb84ef4c2a0bc5cb1c793 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:10:26 +0800 Subject: [PATCH 01/36] chore(gradle): add build-logic --- build-logic/convention/build.gradle.kts | 27 +++++++++ .../main/kotlin/KmpLibraryConventionPlugin.kt | 17 ++++++ .../kotlin/MavenPublishConventionPlugin.kt | 13 +++++ .../main/kotlin/SpotlessConventionPlugin.kt | 37 +++++++++++++ .../arthurkun/generic/datastore/KmpLibrary.kt | 40 ++++++++++++++ .../generic/datastore/MavenPublish.kt | 49 +++++++++++++++++ build-logic/gradle.properties | 4 ++ build-logic/settings.gradle.kts | 21 +++++++ build.gradle.kts | 40 +------------- generic-datastore-compose/build.gradle.kts | 55 +------------------ generic-datastore/build.gradle.kts | 53 +----------------- gradle/libs.versions.toml | 6 ++ settings.gradle.kts | 1 + 13 files changed, 222 insertions(+), 141 deletions(-) create mode 100644 build-logic/convention/build.gradle.kts create mode 100644 build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt create mode 100644 build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt create mode 100644 build-logic/gradle.properties create mode 100644 build-logic/settings.gradle.kts diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 00000000..3c407462 --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + `kotlin-dsl` +} + +dependencies { + compileOnly(libs.android.gradle.plugin) + compileOnly(libs.kotlin.gradle.plugin) + implementation(libs.spotless.gradle.plugin) + compileOnly(libs.vanniktech.maven.publish.plugin) +} + +gradlePlugin { + plugins { + register("spotless") { + id = "generic-datastore.spotless" + implementationClass = "SpotlessConventionPlugin" + } + register("kmpLibrary") { + id = "generic-datastore.kmp-library" + implementationClass = "KmpLibraryConventionPlugin" + } + register("mavenPublish") { + id = "generic-datastore.maven-publish" + implementationClass = "MavenPublishConventionPlugin" + } + } +} diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt new file mode 100644 index 00000000..e678cb61 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -0,0 +1,17 @@ +import io.github.arthurkun.generic.datastore.configureKmpLibrary +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +class KmpLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("org.jetbrains.kotlin.multiplatform") + pluginManager.apply("com.android.kotlin.multiplatform.library") + + val kmpExtension = + extensions.getByType(KotlinMultiplatformExtension::class.java) + configureKmpLibrary(kmpExtension) + } + } +} diff --git a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt new file mode 100644 index 00000000..d387ed87 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt @@ -0,0 +1,13 @@ +import io.github.arthurkun.generic.datastore.configureMavenPublish +import org.gradle.api.Plugin +import org.gradle.api.Project + +class MavenPublishConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.vanniktech.maven.publish") + + configureMavenPublish() + } + } +} diff --git a/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt new file mode 100644 index 00000000..4df4ce63 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt @@ -0,0 +1,37 @@ +import com.diffplug.gradle.spotless.SpotlessExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.getByType + +class SpotlessConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.diffplug.spotless") + + val libs = rootProject.extensions + .getByType() + .named("libs") + + extensions.configure { + kotlin { + target("**/*.kt", "**/*.kts") + targetExclude("**/build/**/*.kt") + ktlint( + libs.findLibrary("ktlint-core").get().get().version!!, + ).editorConfigOverride( + mapOf("ktlint_standard_annotation" to "disabled"), + ) + trimTrailingWhitespace() + endWithNewline() + } + format("xml") { + target("**/*.xml") + trimTrailingWhitespace() + endWithNewline() + } + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt new file mode 100644 index 00000000..8974afb6 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt @@ -0,0 +1,40 @@ +package io.github.arthurkun.generic.datastore + +import org.gradle.api.Project +import org.gradle.api.tasks.testing.Test +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget +import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile + +internal fun Project.configureKmpLibrary( + kmpExtension: KotlinMultiplatformExtension, +) { + kmpExtension.apply { + explicitApi() + + applyDefaultHierarchyTemplate() + + iosX64() + iosArm64() + iosSimulatorArm64() + + jvm() + + compilerOptions { + freeCompilerArgs.addAll( + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-Xexpect-actual-classes", + ) + } + } + + tasks.withType(Test::class.java).configureEach { + useJUnitPlatform() + } + + tasks.withType(KotlinNativeCompile::class.java).configureEach { + compilerOptions { + optIn.add("kotlinx.cinterop.ExperimentalForeignApi") + } + } +} diff --git a/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt b/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt new file mode 100644 index 00000000..f929fd95 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt @@ -0,0 +1,49 @@ +package io.github.arthurkun.generic.datastore + +import com.vanniktech.maven.publish.MavenPublishBaseExtension +import org.gradle.api.Project +import org.gradle.api.publish.PublishingExtension +import org.gradle.kotlin.dsl.configure + +internal fun Project.configureMavenPublish() { + version = providers.environmentVariable("RELEASE_TAG") + .map { it.removePrefix("v") } + .getOrElse("1.0.0") + + extensions.configure { + repositories { + maven { + name = "GitHubPackages" + url = uri("https://maven.pkg.github.com/ArthurKun21/generic-datastore") + credentials { + username = System.getenv("GITHUB_ACTOR") + password = System.getenv("GITHUB_TOKEN") + } + } + } + } + + extensions.configure { + pom { + url.set("https://github.com/ArthurKun21/generic-datastore") + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + } + } + developers { + developer { + id.set("ArthurKun21") + name.set("Arthur") + email.set("16458204+ArthurKun21@users.noreply.github.com") + } + } + scm { + connection.set("scm:git:git://github.com/ArthurKun21/generic-datastore.git") + developerConnection.set("scm:git:ssh://github.com/ArthurKun21/generic-datastore.git") + url.set("https://github.com/ArthurKun21/generic-datastore") + } + } + } +} diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties new file mode 100644 index 00000000..1c9073eb --- /dev/null +++ b/build-logic/gradle.properties @@ -0,0 +1,4 @@ +# Gradle properties are not passed to included builds https://github.com/gradle/gradle/issues/2534 +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configureondemand=true diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..f4f70e7a --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,21 @@ +dependencyResolutionManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-logic" +include(":convention") diff --git a/build.gradle.kts b/build.gradle.kts index a03c5fc7..805a1296 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,35 +6,16 @@ plugins { alias(libs.plugins.android.library) apply false alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.kotlin.multiplatform) apply false - alias(libs.plugins.spotless) apply false alias(libs.plugins.vanniktech.maven.publish) apply false alias(libs.plugins.jetbrains.compose) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.wire) apply false + id("generic-datastore.spotless") apply false } -version = providers.environmentVariable("RELEASE_TAG") - .map { it.removePrefix("v") } - .getOrElse("1.0.0") - subprojects { - version = rootProject.version - apply(plugin = "com.diffplug.spotless") + apply(plugin = "generic-datastore.spotless") - plugins.withId("com.vanniktech.maven.publish") { - configure { - repositories { - maven { - name = "GitHubPackages" - url = uri("https://maven.pkg.github.com/ArthurKun21/generic-datastore") - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") - } - } - } - } - } tasks.withType().configureEach { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) @@ -44,21 +25,4 @@ subprojects { ) } } - configure { - kotlin { - target("**/*.kt", "**/*.kts") - targetExclude("**/build/**/*.kt") - ktlint(libs.ktlint.core.get().version).editorConfigOverride( - mapOf("ktlint_standard_annotation" to "disabled"), - ) - trimTrailingWhitespace() - endWithNewline() - } - format("xml") { - target("**/*.xml") - trimTrailingWhitespace() - endWithNewline() - } - } } - diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 4c877141..5611f613 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -1,17 +1,10 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile - plugins { - alias(libs.plugins.kotlin.multiplatform) - alias(libs.plugins.vanniktech.maven.publish) - alias(libs.plugins.android.library) + id("generic-datastore.kmp-library") + id("generic-datastore.maven-publish") alias(libs.plugins.compose.compiler) } kotlin { - explicitApi() - - applyDefaultHierarchyTemplate() - androidLibrary { namespace = "io.github.arthurkun.generic.datastore.compose" compileSdk = libs.versions.compile.sdk.get().toInt() @@ -28,19 +21,9 @@ kotlin { } } - jvm { - testRuns["test"].executionTask.configure { - useJUnitPlatform() - } - } - - iosX64() - iosArm64() - iosSimulatorArm64() - sourceSets { commonMain.dependencies { - api(project(":generic-datastore")) // Core library dependency + api(project(":generic-datastore")) implementation(libs.compose.runtime) } @@ -70,19 +53,6 @@ kotlin { } } } - - compilerOptions { - freeCompilerArgs.addAll( - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-Xexpect-actual-classes", - ) - } -} - -tasks.withType().configureEach { - compilerOptions { - optIn.add("kotlinx.cinterop.ExperimentalForeignApi") - } } mavenPublishing { @@ -91,24 +61,5 @@ mavenPublishing { pom { name.set("Generic Datastore Compose Extensions") description.set("Jetpack Compose extensions for Generic Datastore Library.") - url.set("https://github.com/ArthurKun21/generic-datastore") - licenses { - license { - name.set("The Apache License, Version 2.0") - url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") - } - } - developers { - developer { - id.set("ArthurKun21") - name.set("Arthur") - email.set("16458204+ArthurKun21@users.noreply.github.com") - } - } - scm { - connection.set("scm:git:git://github.com/ArthurKun21/generic-datastore.git") - developerConnection.set("scm:git:ssh://github.com/ArthurKun21/generic-datastore.git") - url.set("https://github.com/ArthurKun21/generic-datastore") - } } } diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index 4b4efcf6..5ce7218d 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -1,15 +1,10 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile - plugins { - alias(libs.plugins.kotlin.multiplatform) - alias(libs.plugins.vanniktech.maven.publish) - alias(libs.plugins.android.library) + id("generic-datastore.kmp-library") + id("generic-datastore.maven-publish") alias(libs.plugins.kotlin.serialization) } kotlin { - explicitApi() - androidLibrary { namespace = "io.github.arthurkun.generic.datastore" compileSdk = libs.versions.compile.sdk.get().toInt() @@ -28,18 +23,6 @@ kotlin { } } - iosX64() - iosArm64() - iosSimulatorArm64() - - jvm { - testRuns["test"].executionTask.configure { - useJUnitPlatform() - } - } - - applyDefaultHierarchyTemplate() - sourceSets { commonMain.dependencies { implementation(libs.coroutines.core) @@ -70,19 +53,6 @@ kotlin { } } } - - compilerOptions { - freeCompilerArgs.addAll( - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-Xexpect-actual-classes", - ) - } -} - -tasks.withType().configureEach { - compilerOptions { - optIn.add("kotlinx.cinterop.ExperimentalForeignApi") - } } mavenPublishing { @@ -91,24 +61,5 @@ mavenPublishing { pom { name.set("Generic Datastore Library") description.set("A generic datastore library for Kotlin Multiplatform.") - url.set("https://github.com/ArthurKun21/generic-datastore") - licenses { - license { - name.set("The Apache License, Version 2.0") - url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") - } - } - developers { - developer { - id.set("ArthurKun21") - name.set("Arthur") - email.set("16458204+ArthurKun21@users.noreply.github.com") - } - } - scm { - connection.set("scm:git:git://github.com/ArthurKun21/generic-datastore.git") - developerConnection.set("scm:git:ssh://github.com/ArthurKun21/generic-datastore.git") - url.set("https://github.com/ArthurKun21/generic-datastore") - } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a4d834da..2830d713 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -80,6 +80,12 @@ wire-runtime = { module = "com.squareup.wire:wire-runtime", version.ref = "wire" ktlint-core = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlint-core" } +# Gradle plugin artifacts (for build-logic convention plugins) +android-gradle-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +spotless-gradle-plugin = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } +vanniktech-maven-publish-plugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "vanniktechMavenPublish" } + [plugins] agp = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 8ab7d37a..eda236ef 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ pluginManagement { + includeBuild("build-logic") repositories { google { content { From 69875ac9277cb9654542c5db5ae7e61a73c824de Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:24:23 +0800 Subject: [PATCH 02/36] chore: move packages --- .../convention/src/main/kotlin/KmpLibraryConventionPlugin.kt | 2 +- .../convention/src/main/kotlin/MavenPublishConventionPlugin.kt | 2 +- .../datastore => generic/datastore/buildlogic}/KmpLibrary.kt | 3 +-- .../datastore => generic/datastore/buildlogic}/MavenPublish.kt | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) rename build-logic/convention/src/main/kotlin/{io/github/arthurkun/generic/datastore => generic/datastore/buildlogic}/KmpLibrary.kt (89%) rename build-logic/convention/src/main/kotlin/{io/github/arthurkun/generic/datastore => generic/datastore/buildlogic}/MavenPublish.kt (97%) diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index e678cb61..36989ad5 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -1,4 +1,4 @@ -import io.github.arthurkun.generic.datastore.configureKmpLibrary +import generic.datastore.buildlogic.configureKmpLibrary import org.gradle.api.Plugin import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension diff --git a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt index d387ed87..8b0c1ab5 100644 --- a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt @@ -1,4 +1,4 @@ -import io.github.arthurkun.generic.datastore.configureMavenPublish +import generic.datastore.buildlogic.configureMavenPublish import org.gradle.api.Plugin import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt similarity index 89% rename from build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt rename to build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt index 8974afb6..d45420c0 100644 --- a/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt @@ -1,9 +1,8 @@ -package io.github.arthurkun.generic.datastore +package generic.datastore.buildlogic import org.gradle.api.Project import org.gradle.api.tasks.testing.Test import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile internal fun Project.configureKmpLibrary( diff --git a/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/MavenPublish.kt similarity index 97% rename from build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt rename to build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/MavenPublish.kt index f929fd95..b1c66cf3 100644 --- a/build-logic/convention/src/main/kotlin/io/github/arthurkun/generic/datastore/MavenPublish.kt +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/MavenPublish.kt @@ -1,4 +1,4 @@ -package io.github.arthurkun.generic.datastore +package generic.datastore.buildlogic import com.vanniktech.maven.publish.MavenPublishBaseExtension import org.gradle.api.Project From 2c6663fe52a325a4b720d9351a1edb3fec55e04a Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Fri, 27 Mar 2026 07:25:44 +0800 Subject: [PATCH 03/36] refactor: rename androidLibrary to android in build logic --- generic-datastore-compose/build.gradle.kts | 2 +- generic-datastore/build.gradle.kts | 2 +- samples/preferenceComposeApp/build.gradle.kts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 5611f613..4add0894 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } kotlin { - androidLibrary { + android { namespace = "io.github.arthurkun.generic.datastore.compose" compileSdk = libs.versions.compile.sdk.get().toInt() minSdk = libs.versions.min.sdk.get().toInt() diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index 5ce7218d..fa71da12 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } kotlin { - androidLibrary { + android { namespace = "io.github.arthurkun.generic.datastore" compileSdk = libs.versions.compile.sdk.get().toInt() minSdk = libs.versions.min.sdk.get().toInt() diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index 1dfd8b15..46de490a 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -10,7 +10,7 @@ plugins { } kotlin { - androidLibrary { + android { namespace = "io.github.arthurkun.generic.datastore.compose.app" compileSdk = libs.versions.compile.sdk.get().toInt() minSdk = libs.versions.min.sdk.get().toInt() From fcfa188ea4a3462f6e40230e0aa289e79f8fd60c Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Fri, 27 Mar 2026 08:33:28 +0800 Subject: [PATCH 04/36] chore: add AndroidConfig for SDK version management --- .../generic/datastore/buildlogic/AndroidConfig.kt | 14 ++++++++++++++ .../generic/datastore/buildlogic/KmpLibrary.kt | 7 +++++++ 2 files changed, 21 insertions(+) create mode 100644 build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt new file mode 100644 index 00000000..f30e1429 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt @@ -0,0 +1,14 @@ +package generic.datastore.buildlogic + +import org.gradle.api.JavaVersion as GradleJavaVersion +import org.jetbrains.kotlin.gradle.dsl.JvmTarget as KotlinJvmTarget + +object AndroidConfig { + const val COMPILE_SDK = 36 + const val TARGET_SDK = 36 + const val MIN_SDK = 24 + + // https://youtrack.jetbrains.com/issue/KT-66995/JvmTarget-and-JavaVersion-compatibility-for-easier-JVM-version-setup + val JavaVersion = GradleJavaVersion.VERSION_17 + val JvmTarget = KotlinJvmTarget.JVM_17 +} diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt index d45420c0..5f484d04 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt @@ -1,7 +1,9 @@ package generic.datastore.buildlogic +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import org.gradle.api.Project import org.gradle.api.tasks.testing.Test +import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile @@ -13,6 +15,11 @@ internal fun Project.configureKmpLibrary( applyDefaultHierarchyTemplate() + targets.withType().configureEach { + compileSdk = AndroidConfig.COMPILE_SDK + minSdk = AndroidConfig.MIN_SDK + } + iosX64() iosArm64() iosSimulatorArm64() From bd018f0b18245be97436733abc9ebf425b73a256 Mon Sep 17 00:00:00 2001 From: arthur <16458204+ArthurKun021@users.noreply.github.com> Date: Fri, 27 Mar 2026 15:05:39 +0800 Subject: [PATCH 05/36] refactor: streamline KmpLibraryConventionPlugin configuration --- .../main/kotlin/KmpLibraryConventionPlugin.kt | 36 +++++++++++++++++-- .../datastore/buildlogic/KmpLibrary.kt | 21 ----------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index 36989ad5..bd698d74 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -1,13 +1,45 @@ +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget +import generic.datastore.buildlogic.AndroidConfig import generic.datastore.buildlogic.configureKmpLibrary import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +@Suppress("unused") class KmpLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("org.jetbrains.kotlin.multiplatform") - pluginManager.apply("com.android.kotlin.multiplatform.library") + with(pluginManager) { + apply("org.jetbrains.kotlin.multiplatform") + apply("com.android.kotlin.multiplatform.library") + } + + extensions.configure { + explicitApi() + + applyDefaultHierarchyTemplate() + + targets.withType().configureEach { + compileSdk = AndroidConfig.COMPILE_SDK + minSdk = AndroidConfig.MIN_SDK + } + + iosX64() + iosArm64() + iosSimulatorArm64() + + jvm() + + compilerOptions { + freeCompilerArgs.addAll( + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-Xexpect-actual-classes", + ) + } + } + val kmpExtension = extensions.getByType(KotlinMultiplatformExtension::class.java) diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt index 5f484d04..a2595e22 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt @@ -1,9 +1,7 @@ package generic.datastore.buildlogic -import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import org.gradle.api.Project import org.gradle.api.tasks.testing.Test -import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile @@ -11,27 +9,8 @@ internal fun Project.configureKmpLibrary( kmpExtension: KotlinMultiplatformExtension, ) { kmpExtension.apply { - explicitApi() - applyDefaultHierarchyTemplate() - targets.withType().configureEach { - compileSdk = AndroidConfig.COMPILE_SDK - minSdk = AndroidConfig.MIN_SDK - } - - iosX64() - iosArm64() - iosSimulatorArm64() - - jvm() - - compilerOptions { - freeCompilerArgs.addAll( - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-Xexpect-actual-classes", - ) - } } tasks.withType(Test::class.java).configureEach { From 8a59b09cdef0272ad7714f721224259fb6813d7b Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:48:16 +0800 Subject: [PATCH 06/36] refactor: remove compileSdk and minSdk from build logic --- generic-datastore-compose/build.gradle.kts | 2 -- generic-datastore/build.gradle.kts | 2 -- 2 files changed, 4 deletions(-) diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 4add0894..2bc75a22 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -7,8 +7,6 @@ plugins { kotlin { android { namespace = "io.github.arthurkun.generic.datastore.compose" - compileSdk = libs.versions.compile.sdk.get().toInt() - minSdk = libs.versions.min.sdk.get().toInt() optimization { consumerKeepRules.file("consumer-rules.pro") diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index fa71da12..fdf7835c 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -7,8 +7,6 @@ plugins { kotlin { android { namespace = "io.github.arthurkun.generic.datastore" - compileSdk = libs.versions.compile.sdk.get().toInt() - minSdk = libs.versions.min.sdk.get().toInt() withJava() From 18ec35257555ae145f26bcdee13e103d4a0a387e Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:49:14 +0800 Subject: [PATCH 07/36] refactor: update mavenPublishing coordinates for clarity --- generic-datastore-compose/build.gradle.kts | 6 +++++- generic-datastore/build.gradle.kts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 2bc75a22..5aa5989d 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -54,7 +54,11 @@ kotlin { } mavenPublishing { - coordinates("com.github.ArthurKun21", "generic-datastore-compose", version.toString()) + coordinates( + groupId = "com.github.ArthurKun21", + artifactId = "generic-datastore-compose", + version = version.toString(), + ) pom { name.set("Generic Datastore Compose Extensions") diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index fdf7835c..dd5cb865 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -54,7 +54,11 @@ kotlin { } mavenPublishing { - coordinates("com.github.ArthurKun21", "generic-datastore", version.toString()) + coordinates( + groupId = "com.github.ArthurKun21", + artifactId = "generic-datastore", + version = version.toString(), + ) pom { name.set("Generic Datastore Library") From e754818b88f7ea7656638c4f7fd06082b4a8cfed Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:50:05 +0800 Subject: [PATCH 08/36] refactor: suppress unstable API usage warnings in build logic --- generic-datastore-compose/build.gradle.kts | 1 + generic-datastore/build.gradle.kts | 1 + 2 files changed, 2 insertions(+) diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 5aa5989d..f1581807 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -8,6 +8,7 @@ kotlin { android { namespace = "io.github.arthurkun.generic.datastore.compose" + @Suppress("UnstableApiUsage") optimization { consumerKeepRules.file("consumer-rules.pro") } diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index dd5cb865..13a93f34 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -10,6 +10,7 @@ kotlin { withJava() + @Suppress("UnstableApiUsage") optimization { consumerKeepRules.file("consumer-rules.pro") } From 8220b9748836c0bb8484d7e7472c97a406892961 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:56:35 +0800 Subject: [PATCH 09/36] refactor: enhance Android configuration setup in build logic --- .../datastore/buildlogic/KmpLibrary.kt | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt index a2595e22..b18e546a 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt @@ -1,17 +1,40 @@ package generic.datastore.buildlogic +import com.android.build.api.dsl.CommonExtension import org.gradle.api.Project import org.gradle.api.tasks.testing.Test +import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile +internal fun Project.configureAndroid(commonExtension: CommonExtension) { + commonExtension.apply { + compileSdk = AndroidConfig.COMPILE_SDK + + defaultConfig.apply { + minSdk = AndroidConfig.MIN_SDK + } + + compileOptions.apply { + sourceCompatibility = AndroidConfig.JavaVersion + targetCompatibility = AndroidConfig.JavaVersion + } + } +} + +internal fun Project.configureCommonKotlinCompileOptions() { + tasks.withType().configureEach { + compilerOptions { + jvmTarget.set(AndroidConfig.JvmTarget) + } + } +} + internal fun Project.configureKmpLibrary( kmpExtension: KotlinMultiplatformExtension, ) { - kmpExtension.apply { - - } tasks.withType(Test::class.java).configureEach { useJUnitPlatform() From aa65d51eeb0090b4987bdb5a011838c8f7084885 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:56:52 +0800 Subject: [PATCH 10/36] refactor: remove iosX64 configuration from KmpLibraryConventionPlugin --- .../convention/src/main/kotlin/KmpLibraryConventionPlugin.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index bd698d74..3d2ab428 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -26,7 +26,6 @@ class KmpLibraryConventionPlugin : Plugin { minSdk = AndroidConfig.MIN_SDK } - iosX64() iosArm64() iosSimulatorArm64() From 40b9834a7cd6eab1890fbe3ac2acef719c030836 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:57:39 +0800 Subject: [PATCH 11/36] refactor: suppress unused warning in MavenPublishConventionPlugin --- .../convention/src/main/kotlin/MavenPublishConventionPlugin.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt index 8b0c1ab5..d663610a 100644 --- a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt @@ -2,6 +2,7 @@ import generic.datastore.buildlogic.configureMavenPublish import org.gradle.api.Plugin import org.gradle.api.Project +@Suppress("unused") class MavenPublishConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { From 6470639db639873d8440cd0e521d154e030306cd Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:57:46 +0800 Subject: [PATCH 12/36] refactor: suppress unused warning in SpotlessConventionPlugin --- .../convention/src/main/kotlin/SpotlessConventionPlugin.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt index 4df4ce63..79480bec 100644 --- a/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt @@ -5,6 +5,7 @@ import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.getByType +@Suppress("unused") class SpotlessConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { From 9ecb5a15c71e7b2e4daf496239e50a9e17485c2a Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 04:59:37 +0800 Subject: [PATCH 13/36] refactor: conditionally include sample projects based on JITPACK environment --- settings.gradle.kts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index eda236ef..c7d36282 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -31,9 +31,13 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } +val isJitPack = System.getenv("JITPACK") == "true" + rootProject.name = "GenericDataStore" -include(":samples:preferenceAndroidApp") -include(":samples:preferenceComposeApp") -include(":samples:protoComposeApp") include(":generic-datastore") include(":generic-datastore-compose") +if (!isJitPack) { + include(":samples:preferenceAndroidApp") + include(":samples:preferenceComposeApp") + include(":samples:protoComposeApp") +} From a601f438337a38abccf20f25996aa4424e473137 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:04:03 +0800 Subject: [PATCH 14/36] docs: update iOS target information in Agents.md --- Agents.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Agents.md b/Agents.md index b73c8a9f..19454032 100644 --- a/Agents.md +++ b/Agents.md @@ -61,7 +61,7 @@ Both library modules target: - **Android** (`androidMain`) - **JVM** (`jvmMain`) -- **iOS** (`iosX64`, `iosArm64`, `iosSimulatorArm64`) +- **iOS** (`iosArm64`, `iosSimulatorArm64`) ## Workflow @@ -313,8 +313,8 @@ targets. The compiler reports `Unresolved reference 'SYSTEM'` during iOS publica **Workaround:** Use the `expect`/`actual` pattern. Declare an `internal expect val` in `commonMain` and provide `actual` implementations in each platform source set (`androidMain`, `jvmMain`, -`iosMain`) that return `FileSystem.SYSTEM`. The `iosMain` source set covers all three iOS targets -(`iosX64`, `iosArm64`, `iosSimulatorArm64`) via `applyDefaultHierarchyTemplate()`. +`iosMain`) that return `FileSystem.SYSTEM`. The `iosMain` source set covers all two iOS targets +(`iosArm64`, `iosSimulatorArm64`) via `applyDefaultHierarchyTemplate()`. Files involved: From 5dd2ad6b65c65ab58de2b5fd04e3425009aaf76d Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:22:50 +0800 Subject: [PATCH 15/36] feat: WIP build-logic --- build-logic/convention/build.gradle.kts | 12 +++++ .../AndroidSampleAppConventionPlugin.kt | 46 +++++++++++++++++++ .../main/kotlin/ComposeConventionPlugin.kt | 16 +++++++ .../main/kotlin/KmpLibraryConventionPlugin.kt | 2 + .../main/kotlin/KmpSampleConventionPlugin.kt | 30 ++++++++++++ .../datastore/buildlogic/KmpLibrary.kt | 4 ++ .../generic/datastore/buildlogic/Libs.kt | 20 ++++++++ build.gradle.kts | 13 ------ gradle/libs.versions.toml | 4 -- samples/preferenceAndroidApp/build.gradle.kts | 23 +--------- samples/preferenceComposeApp/build.gradle.kts | 18 ++------ samples/protoComposeApp/build.gradle.kts | 13 +----- 12 files changed, 138 insertions(+), 63 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt create mode 100644 build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 3c407462..8479d5f1 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -23,5 +23,17 @@ gradlePlugin { id = "generic-datastore.maven-publish" implementationClass = "MavenPublishConventionPlugin" } + register("compose") { + id = "gd.compose" + implementationClass = "ComposeConventionPlugin" + } + register("kmpSample") { + id = "generic-datastore.kmp-sample" + implementationClass = "KmpSampleConventionPlugin" + } + register("androidSampleApp") { + id = "generic-datastore.android-sample-app" + implementationClass = "AndroidSampleAppConventionPlugin" + } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt new file mode 100644 index 00000000..c8a8f94b --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt @@ -0,0 +1,46 @@ +import com.android.build.api.dsl.ApplicationExtension +import generic.datastore.buildlogic.AndroidConfig +import generic.datastore.buildlogic.configureCommonKotlinCompileOptions +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +@Suppress("unused") +class AndroidSampleAppConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.android.application") + pluginManager.apply("org.jetbrains.kotlin.plugin.compose") + + extensions.configure { + compileSdk = AndroidConfig.COMPILE_SDK + + defaultConfig { + minSdk = AndroidConfig.MIN_SDK + targetSdk = AndroidConfig.TARGET_SDK + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + compileOptions { + sourceCompatibility = AndroidConfig.JavaVersion + targetCompatibility = AndroidConfig.JavaVersion + } + + buildFeatures { + compose = true + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + } + + configureCommonKotlinCompileOptions() + } + } +} diff --git a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt new file mode 100644 index 00000000..94d731f8 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt @@ -0,0 +1,16 @@ +import generic.datastore.buildlogic.libs +import generic.datastore.buildlogic.pluginId +import org.gradle.api.Plugin +import org.gradle.api.Project + +@Suppress("unused") +class ComposeConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply(libs.pluginId("compose-compiler")) + apply(libs.pluginId("jetbrains-compose")) + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index 3d2ab428..db70112b 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -1,5 +1,6 @@ import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import generic.datastore.buildlogic.AndroidConfig +import generic.datastore.buildlogic.configureCommonKotlinCompileOptions import generic.datastore.buildlogic.configureKmpLibrary import org.gradle.api.Plugin import org.gradle.api.Project @@ -43,6 +44,7 @@ class KmpLibraryConventionPlugin : Plugin { val kmpExtension = extensions.getByType(KotlinMultiplatformExtension::class.java) configureKmpLibrary(kmpExtension) + configureCommonKotlinCompileOptions() } } } diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt new file mode 100644 index 00000000..440bb66a --- /dev/null +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -0,0 +1,30 @@ +import generic.datastore.buildlogic.configureCommonKotlinCompileOptions +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.testing.Test +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +@Suppress("unused") +class KmpSampleConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + pluginManager.apply("org.jetbrains.kotlin.multiplatform") + + extensions.configure { + applyDefaultHierarchyTemplate() + + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") + } + } + + configureCommonKotlinCompileOptions() + + tasks.withType().configureEach { + useJUnitPlatform() + } + } + } +} diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt index b18e546a..1e009fe4 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt @@ -27,6 +27,10 @@ internal fun Project.configureCommonKotlinCompileOptions() { tasks.withType().configureEach { compilerOptions { jvmTarget.set(AndroidConfig.JvmTarget) + freeCompilerArgs.addAll( + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=kotlin.time.ExperimentalTime", + ) } } } diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt new file mode 100644 index 00000000..f167ab27 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt @@ -0,0 +1,20 @@ +package generic.datastore.buildlogic + +import org.gradle.api.Project +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.getByType + +val Project.libs: VersionCatalog + get() = extensions.getByType().named("libs") + +fun VersionCatalog.library(name: String): Provider = + findLibrary(name).get() + +fun VersionCatalog.pluginId(name: String): String = + findPlugin(name).get().get().pluginId + +fun VersionCatalog.version(name: String): String = + findVersion(name).get().requiredVersion diff --git a/build.gradle.kts b/build.gradle.kts index 805a1296..c30cf090 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,3 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { alias(libs.plugins.agp) apply false alias(libs.plugins.android.library) apply false @@ -15,14 +12,4 @@ plugins { subprojects { apply(plugin = "generic-datastore.spotless") - - tasks.withType().configureEach { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - freeCompilerArgs.addAll( - "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-opt-in=kotlin.time.ExperimentalTime", - ) - } - } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2830d713..dd532616 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,4 @@ [versions] -compile-sdk = "36" -target-sdk = "36" -min-sdk = "24" - agp = "9.1.0" kotlin = "2.3.20" diff --git a/samples/preferenceAndroidApp/build.gradle.kts b/samples/preferenceAndroidApp/build.gradle.kts index 761d7430..4cd0a3bb 100644 --- a/samples/preferenceAndroidApp/build.gradle.kts +++ b/samples/preferenceAndroidApp/build.gradle.kts @@ -1,23 +1,14 @@ plugins { - id("com.android.application") - alias(libs.plugins.compose.compiler) + id("generic-datastore.android-sample-app") } android { namespace = "io.github.arthurkun.generic.datastore.app" - compileSdk = libs.versions.compile.sdk.get().toInt() defaultConfig { applicationId = "io.github.arthurkun.generic.datastore.app" - minSdk = libs.versions.min.sdk.get().toInt() - targetSdk = libs.versions.target.sdk.get().toInt() versionCode = 1 versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } } buildTypes { @@ -30,18 +21,6 @@ android { signingConfig = signingConfigs.getByName("debug") } } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - buildFeatures { - compose = true - } - packaging { - resources { - excludes += "/META-INF/{AL2.0,LGPL2.1}" - } - } } dependencies { diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index 46de490a..6633ee91 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -1,19 +1,19 @@ +import generic.datastore.buildlogic.AndroidConfig import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { - alias(libs.plugins.kotlin.multiplatform) + id("generic-datastore.kmp-sample") + id("gd.compose") alias(libs.plugins.android.library) - alias(libs.plugins.compose.compiler) alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.jetbrains.compose) } kotlin { android { namespace = "io.github.arthurkun.generic.datastore.compose.app" - compileSdk = libs.versions.compile.sdk.get().toInt() - minSdk = libs.versions.min.sdk.get().toInt() + compileSdk = AndroidConfig.COMPILE_SDK + minSdk = AndroidConfig.MIN_SDK withJava() @@ -38,8 +38,6 @@ kotlin { } } - applyDefaultHierarchyTemplate() - sourceSets { val commonMain by getting { dependencies { @@ -72,12 +70,6 @@ kotlin { androidMain.dependsOn(jvmCommon) desktopMain.dependsOn(jvmCommon) } - - compilerOptions { - freeCompilerArgs.addAll( - "-Xexpect-actual-classes", - ) - } } compose.desktop { diff --git a/samples/protoComposeApp/build.gradle.kts b/samples/protoComposeApp/build.gradle.kts index db24e972..c7d65f88 100644 --- a/samples/protoComposeApp/build.gradle.kts +++ b/samples/protoComposeApp/build.gradle.kts @@ -2,9 +2,8 @@ import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { - alias(libs.plugins.kotlin.multiplatform) - alias(libs.plugins.compose.compiler) - alias(libs.plugins.jetbrains.compose) + id("generic-datastore.kmp-sample") + id("gd.compose") alias(libs.plugins.wire) } @@ -15,8 +14,6 @@ kotlin { } } - applyDefaultHierarchyTemplate() - sourceSets { val commonMain by getting { dependencies { @@ -35,12 +32,6 @@ kotlin { } } } - - compilerOptions { - freeCompilerArgs.addAll( - "-Xexpect-actual-classes", - ) - } } wire { From 3655cb21dbd6c212abb74b79540bb966cead7741 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:30:16 +0800 Subject: [PATCH 16/36] refactor: move files to another package --- .../src/main/kotlin/AndroidSampleAppConventionPlugin.kt | 4 ++-- .../convention/src/main/kotlin/ComposeConventionPlugin.kt | 4 ++-- .../src/main/kotlin/KmpLibraryConventionPlugin.kt | 6 +++--- .../convention/src/main/kotlin/KmpSampleConventionPlugin.kt | 2 +- .../src/main/kotlin/MavenPublishConventionPlugin.kt | 2 +- .../{generic/datastore => gd}/buildlogic/AndroidConfig.kt | 2 +- .../{generic/datastore => gd}/buildlogic/KmpLibrary.kt | 2 +- .../kotlin/{generic/datastore => gd}/buildlogic/Libs.kt | 2 +- .../{generic/datastore => gd}/buildlogic/MavenPublish.kt | 2 +- samples/preferenceComposeApp/build.gradle.kts | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) rename build-logic/convention/src/main/kotlin/{generic/datastore => gd}/buildlogic/AndroidConfig.kt (92%) rename build-logic/convention/src/main/kotlin/{generic/datastore => gd}/buildlogic/KmpLibrary.kt (97%) rename build-logic/convention/src/main/kotlin/{generic/datastore => gd}/buildlogic/Libs.kt (94%) rename build-logic/convention/src/main/kotlin/{generic/datastore => gd}/buildlogic/MavenPublish.kt (97%) diff --git a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt index c8a8f94b..3cda73c2 100644 --- a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt @@ -1,6 +1,6 @@ import com.android.build.api.dsl.ApplicationExtension -import generic.datastore.buildlogic.AndroidConfig -import generic.datastore.buildlogic.configureCommonKotlinCompileOptions +import gd.buildlogic.AndroidConfig +import gd.buildlogic.configureCommonKotlinCompileOptions import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure diff --git a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt index 94d731f8..a2eb8fff 100644 --- a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt @@ -1,5 +1,5 @@ -import generic.datastore.buildlogic.libs -import generic.datastore.buildlogic.pluginId +import gd.buildlogic.libs +import gd.buildlogic.pluginId import org.gradle.api.Plugin import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index db70112b..31d1257c 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -1,7 +1,7 @@ import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget -import generic.datastore.buildlogic.AndroidConfig -import generic.datastore.buildlogic.configureCommonKotlinCompileOptions -import generic.datastore.buildlogic.configureKmpLibrary +import gd.buildlogic.AndroidConfig +import gd.buildlogic.configureCommonKotlinCompileOptions +import gd.buildlogic.configureKmpLibrary import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index 440bb66a..863f61e1 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -1,4 +1,4 @@ -import generic.datastore.buildlogic.configureCommonKotlinCompileOptions +import gd.buildlogic.configureCommonKotlinCompileOptions import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.testing.Test diff --git a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt index d663610a..16e1c419 100644 --- a/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/MavenPublishConventionPlugin.kt @@ -1,4 +1,4 @@ -import generic.datastore.buildlogic.configureMavenPublish +import gd.buildlogic.configureMavenPublish import org.gradle.api.Plugin import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt b/build-logic/convention/src/main/kotlin/gd/buildlogic/AndroidConfig.kt similarity index 92% rename from build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt rename to build-logic/convention/src/main/kotlin/gd/buildlogic/AndroidConfig.kt index f30e1429..7f39be73 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/AndroidConfig.kt +++ b/build-logic/convention/src/main/kotlin/gd/buildlogic/AndroidConfig.kt @@ -1,4 +1,4 @@ -package generic.datastore.buildlogic +package gd.buildlogic import org.gradle.api.JavaVersion as GradleJavaVersion import org.jetbrains.kotlin.gradle.dsl.JvmTarget as KotlinJvmTarget diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt similarity index 97% rename from build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt rename to build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt index 1e009fe4..b94bfd43 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt @@ -1,4 +1,4 @@ -package generic.datastore.buildlogic +package gd.buildlogic import com.android.build.api.dsl.CommonExtension import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt b/build-logic/convention/src/main/kotlin/gd/buildlogic/Libs.kt similarity index 94% rename from build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt rename to build-logic/convention/src/main/kotlin/gd/buildlogic/Libs.kt index f167ab27..57f2b1c8 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/Libs.kt +++ b/build-logic/convention/src/main/kotlin/gd/buildlogic/Libs.kt @@ -1,4 +1,4 @@ -package generic.datastore.buildlogic +package gd.buildlogic import org.gradle.api.Project import org.gradle.api.artifacts.MinimalExternalModuleDependency diff --git a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/MavenPublish.kt b/build-logic/convention/src/main/kotlin/gd/buildlogic/MavenPublish.kt similarity index 97% rename from build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/MavenPublish.kt rename to build-logic/convention/src/main/kotlin/gd/buildlogic/MavenPublish.kt index b1c66cf3..ce46c70c 100644 --- a/build-logic/convention/src/main/kotlin/generic/datastore/buildlogic/MavenPublish.kt +++ b/build-logic/convention/src/main/kotlin/gd/buildlogic/MavenPublish.kt @@ -1,4 +1,4 @@ -package generic.datastore.buildlogic +package gd.buildlogic import com.vanniktech.maven.publish.MavenPublishBaseExtension import org.gradle.api.Project diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index 6633ee91..b9649581 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -1,4 +1,4 @@ -import generic.datastore.buildlogic.AndroidConfig +import gd.buildlogic.AndroidConfig import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat From 95d5f733c78f1eae1199283df9b8a6b8f77ca23a Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 05:34:33 +0800 Subject: [PATCH 17/36] refactor: simplify Android configuration by extracting setup logic --- .../kotlin/AndroidSampleAppConventionPlugin.kt | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt index 3cda73c2..555363d3 100644 --- a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt @@ -1,5 +1,5 @@ import com.android.build.api.dsl.ApplicationExtension -import gd.buildlogic.AndroidConfig +import gd.buildlogic.configureAndroid import gd.buildlogic.configureCommonKotlinCompileOptions import org.gradle.api.Plugin import org.gradle.api.Project @@ -13,20 +13,10 @@ class AndroidSampleAppConventionPlugin : Plugin { pluginManager.apply("org.jetbrains.kotlin.plugin.compose") extensions.configure { - compileSdk = AndroidConfig.COMPILE_SDK + configureAndroid(this) defaultConfig { - minSdk = AndroidConfig.MIN_SDK - targetSdk = AndroidConfig.TARGET_SDK testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } - } - - compileOptions { - sourceCompatibility = AndroidConfig.JavaVersion - targetCompatibility = AndroidConfig.JavaVersion } buildFeatures { From 3706547ec1cf912e08a21fa14214f8def96dfc76 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:04:28 +0800 Subject: [PATCH 18/36] refactor: update plugin IDs for consistency and clarity --- build-logic/convention/build.gradle.kts | 4 ++-- .../src/main/kotlin/AndroidSampleAppConventionPlugin.kt | 6 ++++-- .../convention/src/main/kotlin/KmpSampleConventionPlugin.kt | 5 ++++- samples/preferenceAndroidApp/build.gradle.kts | 2 +- samples/preferenceComposeApp/build.gradle.kts | 3 +-- samples/protoComposeApp/build.gradle.kts | 3 +-- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 8479d5f1..37236989 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -28,11 +28,11 @@ gradlePlugin { implementationClass = "ComposeConventionPlugin" } register("kmpSample") { - id = "generic-datastore.kmp-sample" + id = "gd.kmp.sample" implementationClass = "KmpSampleConventionPlugin" } register("androidSampleApp") { - id = "generic-datastore.android-sample-app" + id = "gd.android.sample" implementationClass = "AndroidSampleAppConventionPlugin" } } diff --git a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt index 555363d3..5b385475 100644 --- a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt @@ -9,8 +9,10 @@ import org.gradle.kotlin.dsl.configure class AndroidSampleAppConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("com.android.application") - pluginManager.apply("org.jetbrains.kotlin.plugin.compose") + with(pluginManager) { + apply("com.android.application") + apply("gd.compose") + } extensions.configure { configureAndroid(this) diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index 863f61e1..f6dc179c 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -10,7 +10,10 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension class KmpSampleConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - pluginManager.apply("org.jetbrains.kotlin.multiplatform") + with(pluginManager) { + apply("org.jetbrains.kotlin.multiplatform") + apply("gd.compose") + } extensions.configure { applyDefaultHierarchyTemplate() diff --git a/samples/preferenceAndroidApp/build.gradle.kts b/samples/preferenceAndroidApp/build.gradle.kts index 4cd0a3bb..fbe60e7b 100644 --- a/samples/preferenceAndroidApp/build.gradle.kts +++ b/samples/preferenceAndroidApp/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("generic-datastore.android-sample-app") + id("gd.android.sample") } android { diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index b9649581..383f77c7 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -3,8 +3,7 @@ import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { - id("generic-datastore.kmp-sample") - id("gd.compose") + id("gd.kmp.sample") alias(libs.plugins.android.library) alias(libs.plugins.kotlin.serialization) } diff --git a/samples/protoComposeApp/build.gradle.kts b/samples/protoComposeApp/build.gradle.kts index c7d65f88..fd81e46e 100644 --- a/samples/protoComposeApp/build.gradle.kts +++ b/samples/protoComposeApp/build.gradle.kts @@ -2,8 +2,7 @@ import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { - id("generic-datastore.kmp-sample") - id("gd.compose") + id("gd.kmp.sample") alias(libs.plugins.wire) } From ff0c603972bdfb9433c88566d285bf2bf06c3a1c Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:10:28 +0800 Subject: [PATCH 19/36] refactor: streamline Android configuration by applying plugin and settings --- .../src/main/kotlin/KmpSampleConventionPlugin.kt | 10 ++++++++++ samples/preferenceComposeApp/build.gradle.kts | 6 ------ samples/protoComposeApp/build.gradle.kts | 3 +++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index f6dc179c..2e105814 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -1,4 +1,8 @@ +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget +import gd.buildlogic.AndroidConfig import gd.buildlogic.configureCommonKotlinCompileOptions +import gd.buildlogic.libs +import gd.buildlogic.pluginId import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.testing.Test @@ -12,12 +16,18 @@ class KmpSampleConventionPlugin : Plugin { with(target) { with(pluginManager) { apply("org.jetbrains.kotlin.multiplatform") + apply(libs.pluginId("android-library")) apply("gd.compose") } extensions.configure { applyDefaultHierarchyTemplate() + targets.withType().configureEach { + compileSdk = AndroidConfig.COMPILE_SDK + minSdk = AndroidConfig.MIN_SDK + } + compilerOptions { freeCompilerArgs.add("-Xexpect-actual-classes") } diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index 383f77c7..9cf4a230 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -1,20 +1,14 @@ -import gd.buildlogic.AndroidConfig import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { id("gd.kmp.sample") - alias(libs.plugins.android.library) alias(libs.plugins.kotlin.serialization) } kotlin { android { namespace = "io.github.arthurkun.generic.datastore.compose.app" - compileSdk = AndroidConfig.COMPILE_SDK - minSdk = AndroidConfig.MIN_SDK - - withJava() optimization { consumerKeepRules.file("consumer-rules.pro") diff --git a/samples/protoComposeApp/build.gradle.kts b/samples/protoComposeApp/build.gradle.kts index fd81e46e..e43f1d06 100644 --- a/samples/protoComposeApp/build.gradle.kts +++ b/samples/protoComposeApp/build.gradle.kts @@ -7,6 +7,9 @@ plugins { } kotlin { + android { + namespace = "io.github.arthurkun.generic.datastore.proto.app" + } jvm("desktop") { testRuns["test"].executionTask.configure { useJUnitPlatform() From 234558255f25caa4518265759651e51e160e4e4b Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:13:10 +0800 Subject: [PATCH 20/36] refactor: update plugin IDs for consistency and clarity --- build-logic/convention/build.gradle.kts | 4 ++-- generic-datastore-compose/build.gradle.kts | 4 ++-- generic-datastore/build.gradle.kts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 37236989..225c95b0 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -16,11 +16,11 @@ gradlePlugin { implementationClass = "SpotlessConventionPlugin" } register("kmpLibrary") { - id = "generic-datastore.kmp-library" + id = "gd.kmp.library" implementationClass = "KmpLibraryConventionPlugin" } register("mavenPublish") { - id = "generic-datastore.maven-publish" + id = "gd.maven.publish" implementationClass = "MavenPublishConventionPlugin" } register("compose") { diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index f1581807..d81a6341 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("generic-datastore.kmp-library") - id("generic-datastore.maven-publish") + id("gd.kmp.library") + id("gd.maven.publish") alias(libs.plugins.compose.compiler) } diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index 13a93f34..c98896bf 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("generic-datastore.kmp-library") - id("generic-datastore.maven-publish") + id("gd.kmp.library") + id("gd.maven.publish") alias(libs.plugins.kotlin.serialization) } From a5a79b35d49675e2c7e5030bc0dc75d1bef51687 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:17:24 +0800 Subject: [PATCH 21/36] refactor: update spotless plugin ID for consistency across configurations --- build-logic/convention/build.gradle.kts | 2 +- .../src/main/kotlin/AndroidSampleAppConventionPlugin.kt | 1 + .../src/main/kotlin/KmpLibraryConventionPlugin.kt | 1 + .../convention/src/main/kotlin/KmpSampleConventionPlugin.kt | 1 + build.gradle.kts | 6 +----- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 225c95b0..a3bb37a5 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { gradlePlugin { plugins { register("spotless") { - id = "generic-datastore.spotless" + id = "gd.spotless" implementationClass = "SpotlessConventionPlugin" } register("kmpLibrary") { diff --git a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt index 5b385475..6d25b61d 100644 --- a/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidSampleAppConventionPlugin.kt @@ -12,6 +12,7 @@ class AndroidSampleAppConventionPlugin : Plugin { with(pluginManager) { apply("com.android.application") apply("gd.compose") + apply("gd.spotless") } extensions.configure { diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index 31d1257c..1d486017 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -15,6 +15,7 @@ class KmpLibraryConventionPlugin : Plugin { with(pluginManager) { apply("org.jetbrains.kotlin.multiplatform") apply("com.android.kotlin.multiplatform.library") + apply("gd.spotless") } extensions.configure { diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index 2e105814..7f96e844 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -18,6 +18,7 @@ class KmpSampleConventionPlugin : Plugin { apply("org.jetbrains.kotlin.multiplatform") apply(libs.pluginId("android-library")) apply("gd.compose") + apply("gd.spotless") } extensions.configure { diff --git a/build.gradle.kts b/build.gradle.kts index c30cf090..1463d510 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,9 +7,5 @@ plugins { alias(libs.plugins.jetbrains.compose) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.wire) apply false - id("generic-datastore.spotless") apply false -} - -subprojects { - apply(plugin = "generic-datastore.spotless") + alias(libs.plugins.spotless) apply false } From e78374eabb4ca70079955666c33538e015a53bdc Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:19:55 +0800 Subject: [PATCH 22/36] refactor: change kotlinx.io dependency from api to implementation --- generic-datastore/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index c98896bf..0ac09e81 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -27,7 +27,7 @@ kotlin { implementation(libs.coroutines.core) api(libs.datastore.preferences.core) api(libs.datastore.core) - api(libs.kotlinx.io.core) + implementation(libs.kotlinx.io.core) implementation(libs.kotlinx.serialization.json) } From e7874dc9bca966474ed69cc8dc7435c059acf00e Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:21:25 +0800 Subject: [PATCH 23/36] refactor: update compose plugin ID for clarity --- generic-datastore-compose/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index d81a6341..b651fec7 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("gd.kmp.library") id("gd.maven.publish") - alias(libs.plugins.compose.compiler) + id("gd.compose") } kotlin { From 56546d1e5d63f04a585fbd6e702e14e5936ee68b Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:30:52 +0800 Subject: [PATCH 24/36] refactor: add KMP library test convention plugin and update build logic --- build-logic/convention/build.gradle.kts | 4 ++ .../main/kotlin/KmpLibraryConventionPlugin.kt | 6 ++- .../kotlin/KmpLibraryTestConventionPlugin.kt | 44 +++++++++++++++++++ generic-datastore-compose/build.gradle.kts | 18 +------- generic-datastore/build.gradle.kts | 17 +------ 5 files changed, 54 insertions(+), 35 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index a3bb37a5..dcce8ecd 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -19,6 +19,10 @@ gradlePlugin { id = "gd.kmp.library" implementationClass = "KmpLibraryConventionPlugin" } + register("kmpLibraryTest") { + id = "gd.kmp.library.test" + implementationClass = "KmpLibraryTestConventionPlugin" + } register("mavenPublish") { id = "gd.maven.publish" implementationClass = "MavenPublishConventionPlugin" diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index 1d486017..ff7553c4 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -2,6 +2,8 @@ import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import gd.buildlogic.AndroidConfig import gd.buildlogic.configureCommonKotlinCompileOptions import gd.buildlogic.configureKmpLibrary +import gd.buildlogic.libs +import gd.buildlogic.pluginId import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure @@ -13,8 +15,8 @@ class KmpLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { with(pluginManager) { - apply("org.jetbrains.kotlin.multiplatform") - apply("com.android.kotlin.multiplatform.library") + apply(libs.pluginId("kotlin-multiplatform")) + apply(libs.pluginId("android-library")) apply("gd.spotless") } diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt new file mode 100644 index 00000000..093075b2 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt @@ -0,0 +1,44 @@ +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget +import gd.buildlogic.library +import gd.buildlogic.libs +import gd.buildlogic.pluginId +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +class KmpLibraryTestConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply(libs.pluginId("kotlin-multiplatform")) + apply(libs.pluginId("android-library")) + } + extensions.configure { + applyDefaultHierarchyTemplate() + + targets.withType().configureEach { + withDeviceTestBuilder { + sourceSetTreeName = "test" + }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + } + + jvm() + + sourceSets.apply { + commonTest.dependencies { + implementation(libs.library("kotlin-test")) + implementation(libs.library("coroutines-test")) + } + + jvmTest.dependencies { + implementation(libs.library("junit5")) + } + } + } + } + } +} diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index b651fec7..0ef1ecf1 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("gd.kmp.library") + id("gd.kmp.library.test") id("gd.maven.publish") id("gd.compose") } @@ -12,12 +13,6 @@ kotlin { optimization { consumerKeepRules.file("consumer-rules.pro") } - - withDeviceTestBuilder { - sourceSetTreeName = "test" - }.configure { - instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } } sourceSets { @@ -26,11 +21,6 @@ kotlin { implementation(libs.compose.runtime) } - commonTest.dependencies { - implementation(libs.kotlin.test) - implementation(libs.coroutines.test) - } - androidMain.dependencies { implementation(libs.lifecycle.runtime.compose) } @@ -45,12 +35,6 @@ kotlin { implementation(libs.androidx.test.espresso) } } - - named("jvmTest") { - dependencies { - implementation(libs.junit5) - } - } } } diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index 0ac09e81..2bca878f 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("gd.kmp.library") + id("gd.kmp.library.test") id("gd.maven.publish") alias(libs.plugins.kotlin.serialization) } @@ -14,12 +15,6 @@ kotlin { optimization { consumerKeepRules.file("consumer-rules.pro") } - - withDeviceTestBuilder { - sourceSetTreeName = "test" - }.configure { - instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } } sourceSets { @@ -31,11 +26,6 @@ kotlin { implementation(libs.kotlinx.serialization.json) } - commonTest.dependencies { - implementation(libs.kotlin.test) - implementation(libs.coroutines.test) - } - getByName("androidDeviceTest") { dependencies { implementation(libs.kotlin.test) @@ -46,11 +36,6 @@ kotlin { implementation(libs.androidx.test.espresso) } } - named("jvmTest") { - dependencies { - implementation(libs.junit5) - } - } } } From 239e730eb8ae91d5cf0070c3ff04cbc3078a626f Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:32:58 +0800 Subject: [PATCH 25/36] refactor: update androidDeviceTest dependencies for consistency --- .../src/main/kotlin/KmpLibraryTestConventionPlugin.kt | 11 +++++++++++ generic-datastore-compose/build.gradle.kts | 11 ----------- generic-datastore/build.gradle.kts | 11 ----------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt index 093075b2..1d5fe31c 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryTestConventionPlugin.kt @@ -34,6 +34,17 @@ class KmpLibraryTestConventionPlugin : Plugin { implementation(libs.library("coroutines-test")) } + getByName("androidDeviceTest") { + dependencies { + implementation(libs.library("kotlin-test")) + implementation(libs.library("coroutines-test")) + implementation(libs.library("datastore-preferences")) + implementation(libs.library("junit4")) + implementation(libs.library("androidx-test-junit")) + implementation(libs.library("androidx-test-espresso")) + } + } + jvmTest.dependencies { implementation(libs.library("junit5")) } diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 0ef1ecf1..07b020fb 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -24,17 +24,6 @@ kotlin { androidMain.dependencies { implementation(libs.lifecycle.runtime.compose) } - - getByName("androidDeviceTest") { - dependencies { - implementation(libs.kotlin.test) - implementation(libs.coroutines.test) - implementation(libs.datastore.preferences) - implementation(libs.junit4) - implementation(libs.androidx.test.junit) - implementation(libs.androidx.test.espresso) - } - } } } diff --git a/generic-datastore/build.gradle.kts b/generic-datastore/build.gradle.kts index 2bca878f..e9134c64 100644 --- a/generic-datastore/build.gradle.kts +++ b/generic-datastore/build.gradle.kts @@ -25,17 +25,6 @@ kotlin { implementation(libs.kotlinx.io.core) implementation(libs.kotlinx.serialization.json) } - - getByName("androidDeviceTest") { - dependencies { - implementation(libs.kotlin.test) - implementation(libs.coroutines.test) - implementation(libs.datastore.preferences) - implementation(libs.junit4) - implementation(libs.androidx.test.junit) - implementation(libs.androidx.test.espresso) - } - } } } From 23f9f3771adaf456fc4982b5e829851bc29a79b8 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:35:17 +0800 Subject: [PATCH 26/36] refactor: simplify desktop JVM configuration in build logic --- samples/preferenceComposeApp/build.gradle.kts | 6 +----- samples/protoComposeApp/build.gradle.kts | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index 9cf4a230..a47ea792 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -25,11 +25,7 @@ kotlin { } } - jvm("desktop") { - testRuns["test"].executionTask.configure { - useJUnitPlatform() - } - } + jvm("desktop") sourceSets { val commonMain by getting { diff --git a/samples/protoComposeApp/build.gradle.kts b/samples/protoComposeApp/build.gradle.kts index e43f1d06..fd6e5ec0 100644 --- a/samples/protoComposeApp/build.gradle.kts +++ b/samples/protoComposeApp/build.gradle.kts @@ -10,11 +10,7 @@ kotlin { android { namespace = "io.github.arthurkun.generic.datastore.proto.app" } - jvm("desktop") { - testRuns["test"].executionTask.configure { - useJUnitPlatform() - } - } + jvm("desktop") sourceSets { val commonMain by getting { From 3c9188dbb6d3f07c016a7362840a1fdf835a6401 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:37:44 +0800 Subject: [PATCH 27/36] refactor: add kotlin-serialization plugin to build logic --- .../convention/src/main/kotlin/KmpSampleConventionPlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index 7f96e844..38ec40fe 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -15,8 +15,9 @@ class KmpSampleConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { with(pluginManager) { - apply("org.jetbrains.kotlin.multiplatform") + apply(libs.pluginId("kotlin-multiplatform")) apply(libs.pluginId("android-library")) + apply(libs.pluginId("kotlin-serialization")) apply("gd.compose") apply("gd.spotless") } From 2495663c24cad329d5dddd08e4f93db6aa24f61d Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:39:25 +0800 Subject: [PATCH 28/36] refactor: update build logic for Kotlin serialization plugin --- samples/preferenceComposeApp/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index a47ea792..5af9af06 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -3,13 +3,13 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { id("gd.kmp.sample") - alias(libs.plugins.kotlin.serialization) } kotlin { android { namespace = "io.github.arthurkun.generic.datastore.compose.app" + @Suppress("UnstableApiUsage") optimization { consumerKeepRules.file("consumer-rules.pro") } From 402a7dc1051ffaac0030e59ef7dc1484135aec1b Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:59:51 +0800 Subject: [PATCH 29/36] chore(deps): add compose-gradle-plugin 1.10.3 --- build-logic/convention/build.gradle.kts | 1 + gradle/libs.versions.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index dcce8ecd..39879de4 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -6,6 +6,7 @@ dependencies { compileOnly(libs.android.gradle.plugin) compileOnly(libs.kotlin.gradle.plugin) implementation(libs.spotless.gradle.plugin) + compileOnly(libs.compose.gradle.plugin) compileOnly(libs.vanniktech.maven.publish.plugin) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd532616..43529682 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -80,6 +80,7 @@ ktlint-core = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlin android-gradle-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } spotless-gradle-plugin = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } +compose-gradle-plugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "compose" } vanniktech-maven-publish-plugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "vanniktechMavenPublish" } [plugins] From ffffcc91d6b08d625f5fc07d1a1b5e882f5b0b8e Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 06:59:57 +0800 Subject: [PATCH 30/36] refactor: update build logic for desktop target and dependencies --- .../main/kotlin/KmpSampleConventionPlugin.kt | 45 +++++++++++++++++++ samples/preferenceComposeApp/build.gradle.kts | 36 ++------------- samples/protoComposeApp/build.gradle.kts | 31 ------------- 3 files changed, 48 insertions(+), 64 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index 38ec40fe..f9e50ffb 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -1,13 +1,20 @@ import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import gd.buildlogic.AndroidConfig import gd.buildlogic.configureCommonKotlinCompileOptions +import gd.buildlogic.library import gd.buildlogic.libs import gd.buildlogic.pluginId import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.testing.Test +import org.gradle.api.file.DuplicatesStrategy +import org.gradle.jvm.tasks.Jar import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.withType +import org.jetbrains.compose.ComposeExtension +import org.jetbrains.compose.ComposePlugin +import org.jetbrains.compose.desktop.DesktopExtension +import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension @Suppress("unused") @@ -30,9 +37,39 @@ class KmpSampleConventionPlugin : Plugin { minSdk = AndroidConfig.MIN_SDK } + jvm("desktop") + compilerOptions { freeCompilerArgs.add("-Xexpect-actual-classes") } + + sourceSets.named("desktopMain") { + dependencies { + implementation(libs.library("coroutines-swing")) + @Suppress("DEPRECATION") + implementation(ComposePlugin.DesktopDependencies.currentOs) + } + } + } + + extensions.configure { + extensions.configure { + application { + buildTypes { + release { + proguard { + configurationFiles.from(project.file("proguard-rules.pro")) + } + } + } + + nativeDistributions { + modules("jdk.unsupported") + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageVersion = "1.0.0" + } + } + } } configureCommonKotlinCompileOptions() @@ -40,6 +77,14 @@ class KmpSampleConventionPlugin : Plugin { tasks.withType().configureEach { useJUnitPlatform() } + + tasks.withType().configureEach { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + exclude("META-INF/AL2.0") + exclude("META-INF/LGPL2.1") + exclude("META-INF/MANIFEST.MF") + } } } } diff --git a/samples/preferenceComposeApp/build.gradle.kts b/samples/preferenceComposeApp/build.gradle.kts index 5af9af06..4e3c39af 100644 --- a/samples/preferenceComposeApp/build.gradle.kts +++ b/samples/preferenceComposeApp/build.gradle.kts @@ -1,6 +1,3 @@ -import org.gradle.jvm.tasks.Jar -import org.jetbrains.compose.desktop.application.dsl.TargetFormat - plugins { id("gd.kmp.sample") } @@ -25,8 +22,6 @@ kotlin { } } - jvm("desktop") - sourceSets { val commonMain by getting { dependencies { @@ -45,19 +40,14 @@ kotlin { } } - val desktopMain by getting { - dependencies { - implementation(libs.coroutines.swing) - implementation(compose.desktop.currentOs) - } - } - val jvmCommon by creating { dependsOn(commonMain) } androidMain.dependsOn(jvmCommon) - desktopMain.dependsOn(jvmCommon) + named("desktopMain") { + dependsOn(jvmCommon) + } } } @@ -65,28 +55,8 @@ compose.desktop { application { mainClass = "io.github.arthurkun.generic.datastore.compose.app.MainKt" - buildTypes { - release { - proguard { - configurationFiles.from(project.file("proguard-rules.pro")) - } - } - } - nativeDistributions { - modules("jdk.unsupported") - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "generic-datastore-sample" - packageVersion = "1.0.0" } } } - -tasks.withType().configureEach { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - - exclude("META-INF/AL2.0") - exclude("META-INF/LGPL2.1") - - exclude("META-INF/MANIFEST.MF") -} diff --git a/samples/protoComposeApp/build.gradle.kts b/samples/protoComposeApp/build.gradle.kts index fd6e5ec0..d10ab220 100644 --- a/samples/protoComposeApp/build.gradle.kts +++ b/samples/protoComposeApp/build.gradle.kts @@ -1,6 +1,3 @@ -import org.gradle.jvm.tasks.Jar -import org.jetbrains.compose.desktop.application.dsl.TargetFormat - plugins { id("gd.kmp.sample") alias(libs.plugins.wire) @@ -10,7 +7,6 @@ kotlin { android { namespace = "io.github.arthurkun.generic.datastore.proto.app" } - jvm("desktop") sourceSets { val commonMain by getting { @@ -22,13 +18,6 @@ kotlin { implementation(libs.wire.runtime) } } - - val desktopMain by getting { - dependencies { - implementation(libs.coroutines.swing) - implementation(compose.desktop.currentOs) - } - } } } @@ -45,28 +34,8 @@ compose.desktop { application { mainClass = "io.github.arthurkun.generic.datastore.proto.app.MainKt" - buildTypes { - release { - proguard { - configurationFiles.from(project.file("proguard-rules.pro")) - } - } - } - nativeDistributions { - modules("jdk.unsupported") - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "generic-datastore-proto-sample" - packageVersion = "1.0.0" } } } - -tasks.withType().configureEach { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - - exclude("META-INF/AL2.0") - exclude("META-INF/LGPL2.1") - - exclude("META-INF/MANIFEST.MF") -} From 125f4f8367dae883b32c1874448bd4d6cb10d803 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 07:02:20 +0800 Subject: [PATCH 31/36] docs: update KMP targets in README for iOS architecture --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7f79f3d..7afd04bc 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ SharedPreferences. ### KMP Targets -Both modules target **Android**, **Desktop (JVM)**, and **iOS** (`iosX64`, `iosArm64`, +Both modules target **Android**, **Desktop (JVM)**, and **iOS** (`iosArm64`, `iosSimulatorArm64`). ## Installation From 066a3707d768d98a175b2443dd76a5cbb9710acd Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 07:15:39 +0800 Subject: [PATCH 32/36] refactor: streamline KmpLibraryConventionPlugin configuration --- .../src/main/kotlin/KmpLibraryConventionPlugin.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index ff7553c4..a5017f40 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -14,6 +14,8 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension class KmpLibraryConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { + configureCommonKotlinCompileOptions() + with(pluginManager) { apply(libs.pluginId("kotlin-multiplatform")) apply(libs.pluginId("android-library")) @@ -21,6 +23,7 @@ class KmpLibraryConventionPlugin : Plugin { } extensions.configure { + configureKmpLibrary(this) explicitApi() applyDefaultHierarchyTemplate() @@ -42,12 +45,6 @@ class KmpLibraryConventionPlugin : Plugin { ) } } - - - val kmpExtension = - extensions.getByType(KotlinMultiplatformExtension::class.java) - configureKmpLibrary(kmpExtension) - configureCommonKotlinCompileOptions() } } } From 566e15e071e22c2fd34bfa12682aa3046b305a6c Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 07:16:25 +0800 Subject: [PATCH 33/36] refactor: simplify configureKmpLibrary function signature --- .../src/main/kotlin/KmpLibraryConventionPlugin.kt | 2 +- .../convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt index a5017f40..186fe110 100644 --- a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -23,7 +23,7 @@ class KmpLibraryConventionPlugin : Plugin { } extensions.configure { - configureKmpLibrary(this) + configureKmpLibrary() explicitApi() applyDefaultHierarchyTemplate() diff --git a/build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt b/build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt index b94bfd43..818d4578 100644 --- a/build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt +++ b/build-logic/convention/src/main/kotlin/gd/buildlogic/KmpLibrary.kt @@ -4,7 +4,6 @@ import com.android.build.api.dsl.CommonExtension import org.gradle.api.Project import org.gradle.api.tasks.testing.Test import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile @@ -35,10 +34,7 @@ internal fun Project.configureCommonKotlinCompileOptions() { } } -internal fun Project.configureKmpLibrary( - kmpExtension: KotlinMultiplatformExtension, -) { - +internal fun Project.configureKmpLibrary() { tasks.withType(Test::class.java).configureEach { useJUnitPlatform() From b92e66de0e51d213ac27d91de8e791fbe8662039 Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 07:17:08 +0800 Subject: [PATCH 34/36] refactor: enhance KmpSampleConventionPlugin with common compile options --- .../src/main/kotlin/KmpSampleConventionPlugin.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt index f9e50ffb..ca9f0ea8 100644 --- a/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/KmpSampleConventionPlugin.kt @@ -1,13 +1,14 @@ import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import gd.buildlogic.AndroidConfig import gd.buildlogic.configureCommonKotlinCompileOptions +import gd.buildlogic.configureKmpLibrary import gd.buildlogic.library import gd.buildlogic.libs import gd.buildlogic.pluginId import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.tasks.testing.Test import org.gradle.api.file.DuplicatesStrategy +import org.gradle.api.tasks.testing.Test import org.gradle.jvm.tasks.Jar import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.withType @@ -21,6 +22,8 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension class KmpSampleConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { + configureCommonKotlinCompileOptions() + with(pluginManager) { apply(libs.pluginId("kotlin-multiplatform")) apply(libs.pluginId("android-library")) @@ -30,6 +33,8 @@ class KmpSampleConventionPlugin : Plugin { } extensions.configure { + configureKmpLibrary() + applyDefaultHierarchyTemplate() targets.withType().configureEach { From 9080ac468bc7fcaeb51d51c205a13aa81a3d985a Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 07:18:26 +0800 Subject: [PATCH 35/36] refactor: simplify SpotlessConventionPlugin by removing unnecessary code --- .../convention/src/main/kotlin/SpotlessConventionPlugin.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt index 79480bec..4a916686 100644 --- a/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/SpotlessConventionPlugin.kt @@ -1,9 +1,8 @@ import com.diffplug.gradle.spotless.SpotlessExtension +import gd.buildlogic.libs import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.getByType @Suppress("unused") class SpotlessConventionPlugin : Plugin { @@ -11,10 +10,6 @@ class SpotlessConventionPlugin : Plugin { with(target) { pluginManager.apply("com.diffplug.spotless") - val libs = rootProject.extensions - .getByType() - .named("libs") - extensions.configure { kotlin { target("**/*.kt", "**/*.kts") From fcb8c7ff719ee453569cd449568b93c26929f80a Mon Sep 17 00:00:00 2001 From: Arthur <16458204+ArthurKun21@users.noreply.github.com> Date: Tue, 7 Apr 2026 07:36:15 +0800 Subject: [PATCH 36/36] refactor: replace gd.compose plugin with compose.compiler alias --- generic-datastore-compose/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generic-datastore-compose/build.gradle.kts b/generic-datastore-compose/build.gradle.kts index 07b020fb..324ad546 100644 --- a/generic-datastore-compose/build.gradle.kts +++ b/generic-datastore-compose/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("gd.kmp.library") id("gd.kmp.library.test") id("gd.maven.publish") - id("gd.compose") + alias(libs.plugins.compose.compiler) } kotlin {