Roomのデータベース定義では
@Database( entities = [Settings::class], version = 1, exportSchema = false )
データベース定義は:appモジュールで行いますが、そうすると各機能モジュールのエンティティを:appモジュールが知る必要があり、モジュール結合を疎にするという設計方針から外れてしまいます。
そこで、各機能モジュールのエンティティ定義を自動で収集するKSP(Kotlin Symbol Processing)を使ったエンティティコレクターを作成することにします。
エンティティコレクターに必要なKSPライブラリをバージョンカタログに追記します。
[versions]
:
# ./gradlew -versionで表示されるKotlinのバージョンに適した最新バージョンにします(自動で上げない)
#noinspection NewerVersionAvailable
gradle-ksp = "2.0.21-1.0.28" # https://mvnrepository.com/artifact/com.google.devtools.ksp/symbol-processing-api
kotlin-poet = "2.2.0" # https://mvnrepository.com/artifact/com.squareup/kotlinpoet
:
[libraries]
:
gradle-ksp = { module = "com.google.devtools.ksp:symbol-processing-api", version.ref = "gradle-ksp" }
kotlin-poet = { module = "com.squareup:kotlinpoet", version.ref = "kotlin-poet" }
:
追記後、『Sync Now』で内容をプロジェクトに反映させます。
エンティティコレクターは、ビルド用の機能ですので、/build-logicディレクトリ内に作成します。
/build-logic直下にkspディレクトリを追加し、直下にkotlinスクリプトbuild.gradle.ktsを作成してモジュール化します。
plugins {
`kotlin-dsl`
}
dependencies {
implementation(libs.gradle.ksp)
implementation(libs.kotlin.poet)
}
/build-logic直下のsettings.gradle.ktsに:build-logic:kspモジュールをビルド対象として追記します。
:
include(":ksp")