KSP クイックスタート
クイックスタートとして、独自のプロセッサを作成するか、サンプルを入手できます。
プロセッサの追加
プロセッサを追加するには、KSP Gradleプラグインを含め、プロセッサへの依存関係を追加する必要があります。
KSP Gradleプラグイン
com.google.devtools.ksp
をbuild.gradle(.kts)
ファイルに追加します。kotlinplugins { id("com.google.devtools.ksp") version "2.2.0-2.0.2" }
groovyplugins { id 'com.google.devtools.ksp' version '2.2.0-2.0.2' }
プロセッサへの依存関係を追加します。 この例ではDaggerを使用しています。追加したいプロセッサに置き換えてください。
kotlindependencies { implementation("com.google.dagger:dagger-compiler:2.51.1") ksp("com.google.dagger:dagger-compiler:2.51.1") }
groovydependencies { implementation 'com.google.dagger:dagger-compiler:2.51.1' ksp 'com.google.dagger:dagger-compiler:2.51.1' }
./gradlew build
を実行します。生成されたコードはbuild/generated/ksp
ディレクトリにあります。
完全な例を次に示します。
plugins {
id("com.google.devtools.ksp") version "2.2.0-2.0.2"
kotlin("jvm")
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation("com.google.dagger:dagger-compiler:2.51.1")
ksp("com.google.dagger:dagger-compiler:2.51.1")
}
plugins {
id 'com.google.devtools.ksp' version '2.2.0-2.0.2'
id 'org.jetbrains.kotlin.jvm' version '2.2.10'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.2.10'
implementation 'com.google.dagger:dagger-compiler:2.51.1'
ksp 'com.google.dagger:dagger-compiler:2.51.1'
}
独自のプロセッサを作成する
空のGradleプロジェクトを作成します。
他のプロジェクトモジュールで使用するために、ルートプロジェクトでKotlinプラグインのバージョン
2.2.0
を指定します。kotlinplugins { kotlin("jvm") version "2.2.0" apply false } buildscript { dependencies { classpath(kotlin("gradle-plugin", version = "2.2.0")) } }
groovyplugins { id 'org.jetbrains.kotlin.jvm' version '2.2.0' apply false } buildscript { dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0' } }
プロセッサをホストするためのモジュールを追加します。
モジュールのビルドスクリプトで、Kotlinプラグインを適用し、KSP APIを
dependencies
ブロックに追加します。kotlinplugins { kotlin("jvm") } repositories { mavenCentral() } dependencies { implementation("com.google.devtools.ksp:symbol-processing-api:2.2.0-2.0.2") }
groovyplugins { id 'org.jetbrains.kotlin.jvm' version '2.2.10' } repositories { mavenCentral() } dependencies { implementation 'com.google.devtools.ksp:symbol-processing-api:2.2.0-2.0.2' }
com.google.devtools.ksp.processing.SymbolProcessor
およびcom.google.devtools.ksp.processing.SymbolProcessorProvider
を実装する必要があります。 あなたが実装するSymbolProcessorProvider
の実装は、実装したSymbolProcessor
をインスタンス化するためのサービスとしてロードされます。以下に注意してください。SymbolProcessor
を作成するためにSymbolProcessorProvider.create()
を実装します。プロセッサが必要とする依存関係(CodeGenerator
、プロセッサオプションなど)をSymbolProcessorProvider.create()
のパラメータを通じて渡します。- メインロジックは
SymbolProcessor.process()
メソッドに記述する必要があります。 - アノテーションの完全修飾名を指定して、
resolver.getSymbolsWithAnnotation()
を使用して処理したいシンボルを取得します。 - KSPの一般的なユースケースは、シンボルを操作するためのカスタマイズされたビジター(インターフェース
com.google.devtools.ksp.symbol.KSVisitor
)を実装することです。シンプルなテンプレートビジターはcom.google.devtools.ksp.symbol.KSDefaultVisitor
です。 SymbolProcessorProvider
およびSymbolProcessor
インターフェースのサンプル実装については、サンプルプロジェクト内の以下のファイルを参照してください。src/main/kotlin/BuilderProcessor.kt
src/main/kotlin/TestProcessor.kt
- 独自のプロセッサを記述したら、
src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider
にその完全修飾名を含めることによって、プロセッサプロバイダーをパッケージに登録します。
プロジェクトで独自のプロセッサを使用する
プロセッサを試したいワークロードを含む別のモジュールを作成します。
kotlinpluginManagement { repositories { gradlePluginPortal() } }
groovypluginManagement { repositories { gradlePluginPortal() } }
モジュールのビルドスクリプトで、指定されたバージョンで
com.google.devtools.ksp
プラグインを適用し、プロセッサを依存関係のリストに追加します。kotlinplugins { id("com.google.devtools.ksp") version "2.2.0-2.0.2" } dependencies { implementation(kotlin("stdlib-jdk8")) implementation(project(":test-processor")) ksp(project(":test-processor")) }
groovyplugins { id 'com.google.devtools.ksp' version '2.2.0-2.0.2' } dependencies { implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.2.10' implementation project(':test-processor') ksp project(':test-processor') }
./gradlew build
を実行します。生成されたコードはbuild/generated/ksp
にあります。
ワークロードにKSPプラグインを適用するサンプルのビルドスクリプトを次に示します。
plugins {
id("com.google.devtools.ksp") version "2.2.0-2.0.2"
kotlin("jvm")
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(project(":test-processor"))
ksp(project(":test-processor"))
}
plugins {
id 'com.google.devtools.ksp' version '2.2.0-2.0.2'
id 'org.jetbrains.kotlin.jvm' version '2.2.10'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.2.10'
implementation project(':test-processor')
ksp project(':test-processor')
}
プロセッサにオプションを渡す
SymbolProcessorEnvironment.options
内のプロセッサオプションは、Gradleビルドスクリプトで指定します。
ksp {
arg("option1", "value1")
arg("option2", "value2")
...
}
IDEに生成されたコードを認識させる
KSP 1.8.0-1.0.9 以降、生成されたソースファイルは自動的に登録されます。 KSP 1.0.9 以降を使用しており、生成されたリソースをIDEに認識させる必要がない場合は、このセクションをスキップしても問題ありません。
デフォルトでは、IntelliJ IDEAなどのIDEは生成されたコードを認識しません。そのため、生成されたシンボルへの参照が解決不能としてマークされます。IDEが生成されたシンボルを認識できるようにするには、以下のパスを生成されたソースルートとしてマークします。
build/generated/ksp/main/kotlin/
build/generated/ksp/main/java/
IDEがリソースディレクトリをサポートしている場合、以下もマークします。
build/generated/ksp/main/resources/
KSPコンシューマーモジュールのビルドスクリプトでこれらのディレクトリを構成する必要がある場合もあります。
kotlin {
sourceSets.main {
kotlin.srcDir("build/generated/ksp/main/kotlin")
}
sourceSets.test {
kotlin.srcDir("build/generated/ksp/test/kotlin")
}
}
kotlin {
sourceSets {
main.kotlin.srcDirs += 'build/generated/ksp/main/kotlin'
test.kotlin.srcDirs += 'build/generated/ksp/test/kotlin'
}
}
IntelliJ IDEAとKSPをGradleプラグインで使用している場合、上記のスニペットでは以下の警告が表示されます。
Execution optimizations have been disabled for task ':publishPluginJar' to ensure correctness due to the following reasons:
Gradle detected a problem with the following location: '../build/generated/ksp/main/kotlin'.
Reason: Task ':publishPluginJar' uses this output of task ':kspKotlin' without declaring an explicit or implicit dependency.
この場合、代わりに以下のスクリプトを使用してください。
plugins {
// ...
idea
}
idea {
module {
// Not using += due to https://github.com/gradle/gradle/issues/8749
sourceDirs = sourceDirs + file("build/generated/ksp/main/kotlin") // or tasks["kspKotlin"].destination
testSourceDirs = testSourceDirs + file("build/generated/ksp/test/kotlin")
generatedSourceDirs = generatedSourceDirs + file("build/generated/ksp/main/kotlin") + file("build/generated/ksp/test/kotlin")
}
}
plugins {
// ...
id 'idea'
}
idea {
module {
// Not using += due to https://github.com/gradle/gradle/issues/8749
sourceDirs = sourceDirs + file('build/generated/ksp/main/kotlin') // or tasks["kspKotlin"].destination
testSourceDirs = testSourceDirs + file('build/generated/ksp/test/kotlin')
generatedSourceDirs = generatedSourceDirs + file('build/generated/ksp/main/kotlin') + file('build/generated/ksp/test/kotlin')
}
}