コンテンツにスキップ

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プラグインを追加します:

// build.gradle.kts
plugins {
    kotlin("multiplatform")
    id("com.google.devtools.ksp")
}

プロセッサーの追加

状態型がcommonMainにあるため、以下が必要です:

  1. 共有ソースから生成ファイルが生成されるよう、共通メタデータのコンパイルに対してプロセッサーを実行する。
  2. すべてのプラットフォームコンパイルが拡張関数を参照できるよう、生成された出力ディレクトリをcommonMainソースルートとして公開する。
  3. 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に存在する場合、kspAndroidkspIosArm64などを追加する必要はありません


セットアップの確認

ビルドが成功すると、生成されたファイルは以下の場所に配置されます:

build/generated/ksp/metadata/commonMain/kotlin/
└── com/example/feature/
    ├── LoginStateTransitions.kt
    └── LoginStateTransitions.kt

トラブルシューティング

コンパイル時に生成ファイルが見つからない

srcDirの呼び出しが存在し、dependsOnブロックが設定されている必要があります。両方が設定されていることを確認し、クリーンビルドを実行してください。

kspCommonMainKotlinMetadataタスクが見つからない

このタスクはKSPプラグインが適用され、かつcommonMainソースセットが存在する場合にのみ作成されます。

KSPバージョンの不一致

KSPバージョンの数値プレフィックスがKotlinバージョンと正確に一致しているか確認してください。