From 3409f937ed87af905e09e05e1907500efbcca366 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Sat, 4 Feb 2023 12:59:37 +0100 Subject: [PATCH] Migrate custom room configuration into a convention plugin And use `CommandLineArgumentProvider` to avoid breaking cacheability: https://issuetracker.google.com/issues/132245929 --- build-logic/convention/build.gradle.kts | 5 ++ .../kotlin/AndroidRoomConventionPlugin.kt | 63 +++++++++++++++++++ build.gradle.kts | 1 + core/database/build.gradle.kts | 13 +--- gradle/libs.versions.toml | 1 + 5 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 6d566c189..0152a902b 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -28,6 +28,7 @@ java { dependencies { compileOnly(libs.android.gradlePlugin) compileOnly(libs.kotlin.gradlePlugin) + compileOnly(libs.ksp.gradlePlugin) } gradlePlugin { @@ -68,6 +69,10 @@ gradlePlugin { id = "nowinandroid.android.hilt" implementationClass = "AndroidHiltConventionPlugin" } + register("androidRoom") { + id = "nowinandroid.android.room" + implementationClass = "AndroidRoomConventionPlugin" + } register("firebase-perf") { id = "nowinandroid.firebase-perf" implementationClass = "FirebasePerfConventionPlugin" diff --git a/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt new file mode 100644 index 000000000..778798b96 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/AndroidRoomConventionPlugin.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.google.devtools.ksp.gradle.KspExtension +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType +import org.gradle.process.CommandLineArgumentProvider +import java.io.File + +class AndroidRoomConventionPlugin : Plugin { + + override fun apply(target: Project) { + with(target) { + pluginManager.apply("com.google.devtools.ksp") + + extensions.configure { + // The schemas directory contains a schema file for each version of the Room database. + // This is required to enable Room auto migrations. + // See https://developer.android.com/reference/kotlin/androidx/room/AutoMigration. + arg(RoomSchemaArgProvider(File(projectDir, "schemas"))) + } + + val libs = extensions.getByType().named("libs") + dependencies { + add("implementation", libs.findLibrary("room.runtime").get()) + add("implementation", libs.findLibrary("room.ktx").get()) + add("ksp", libs.findLibrary("room.compiler").get()) + } + } + } + + /** + * https://issuetracker.google.com/issues/132245929 + * [Export schemas](https://developer.android.com/training/data-storage/room/migrating-db-versions#export-schemas) + */ + class RoomSchemaArgProvider( + @get:InputDirectory + @get:PathSensitive(PathSensitivity.RELATIVE) + val schemaDir: File, + ) : CommandLineArgumentProvider { + override fun asArguments() = listOf("room.schemaLocation=${schemaDir.path}") + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 6f6d375d7..30640d41c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,5 +30,6 @@ plugins { alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.hilt) apply false + alias(libs.plugins.ksp) apply false alias(libs.plugins.secrets) apply false } \ No newline at end of file diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index 79fd4ded9..79f980b6c 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -22,18 +22,11 @@ plugins { id("nowinandroid.android.library") id("nowinandroid.android.library.jacoco") id("nowinandroid.android.hilt") - alias(libs.plugins.ksp) + id("nowinandroid.android.room") } android { defaultConfig { - // The schemas directory contains a schema file for each version of the Room database. - // This is required to enable Room auto migrations. - // See https://developer.android.com/reference/kotlin/androidx/room/AutoMigration. - ksp { - arg("room.schemaLocation", "$projectDir/schemas") - } - testInstrumentationRunner = "com.google.samples.apps.nowinandroid.core.testing.NiaTestRunner" } @@ -57,10 +50,6 @@ android { dependencies { implementation(project(":core:model")) - implementation(libs.room.runtime) - implementation(libs.room.ktx) - ksp(libs.room.compiler) - implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlinx.datetime) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 828e38f12..2d53a438f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -121,6 +121,7 @@ turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine # Dependencies of the included build-logic android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } +ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }