KotlinマルチプラットフォームのKSPセットアップ¶
monaka-transitionsプロセッサーはKSP (Kotlin Symbol Processing)を使用して、状態型に付与された@Transitionおよび@SelfTransitionアノテーションからtoXxx()およびtoSelf()拡張関数を生成します。
状態型はcommonMainに配置されます。そのため、生成された拡張関数もcommonMainから利用できる必要があります。これにより、共有ソースセット内のstateMachine { }ハンドラーでstate.toLoading()を呼び出せるようになります。これは、通常のAndroidまたはJVMプロジェクトと比較して、Gradleの追加設定が少し必要です。
バージョン互換性¶
KSPプラグインのバージョンは、プロジェクトで使用しているKotlinのバージョンと互換性がなければなりません。KSPプラグインのバージョンプレフィックスはKotlinのバージョンと一致します:
| Kotlinバージョン | KSPバージョンプレフィックス |
|---|---|
| 2.1.x | 2.1.x-… |
| 2.0.x | 2.0.x-… |
| 1.9.x | 1.9.x-… |
最新の互換リリースについてはgithub.com/google/ksp/releasesを確認してください。バージョンカタログを使用して同期を保ちます:
# gradle/libs.versions.toml
[versions]
kotlin = "2.1.0"
ksp = "2.1.0-1.0.29" # must share the same Kotlin prefix
[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
プラグインの適用¶
アノテーション付きの状態型を含むすべてのモジュールにKSPプラグインを追加します:
プロセッサーの追加¶
状態型がcommonMainにあるため、以下が必要です:
- 共有ソースから生成ファイルが生成されるよう、共通メタデータのコンパイルに対してプロセッサーを実行する。
- すべてのプラットフォームコンパイルが拡張関数を参照できるよう、生成された出力ディレクトリを
commonMainソースルートとして公開する。 commonMainに依存するプラットフォームコンパイルよりも前にメタデータKSPタスクが実行されるようにする。
// build.gradle.kts
dependencies {
add("kspCommonMainMetadata", "dev.gmvalentino.monaka:monaka-transitions:<version>")
}
kotlin {
sourceSets {
commonMain {
kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin")
}
}
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask<*>>().configureEach {
if (name != "kspCommonMainKotlinMetadata") {
dependsOn("kspCommonMainKotlinMetadata")
}
}
ターゲット¶
プロセッサーはcommonMainMetadataに対して一度だけ実行する必要があります。アノテーション付きクラスがすべてcommonMainに存在する場合、kspAndroidやkspIosArm64などを追加する必要はありません。
セットアップの確認¶
ビルドが成功すると、生成されたファイルは以下の場所に配置されます:
build/generated/ksp/metadata/commonMain/kotlin/
└── com/example/feature/
├── LoginStateTransitions.kt
└── LoginStateTransitions.kt
トラブルシューティング¶
コンパイル時に生成ファイルが見つからない
srcDirの呼び出しが存在し、dependsOnブロックが設定されている必要があります。両方が設定されていることを確認し、クリーンビルドを実行してください。
kspCommonMainKotlinMetadataタスクが見つからない
このタスクはKSPプラグインが適用され、かつcommonMainソースセットが存在する場合にのみ作成されます。
KSPバージョンの不一致
KSPバージョンの数値プレフィックスがKotlinバージョンと正確に一致しているか確認してください。