KSP クイックスタート
手早く始めるには、独自のプロセッサを作成するか、サンプルを入手できます。
プロセッサの追加
プロセッサを追加するには、KSP Gradle Pluginを含め、プロセッサへの依存関係を追加する必要があります。
- KSP Gradle Plugin
com.google.devtools.ksp
をbuild.gradle(.kts)
ファイルに追加します。
- Kotlin
- Groovy
plugins {
id("com.google.devtools.ksp") version "2.1.10-1.0.31"
}
plugins {
id 'com.google.devtools.ksp' version '2.1.10-1.0.31'
}
- プロセッサへの依存関係を追加します。 この例ではDaggerを使用します。追加するプロセッサに置き換えてください。
- Kotlin
- Groovy
dependencies {
implementation("com.google.dagger:dagger-compiler:2.51.1")
ksp("com.google.dagger:dagger-compiler:2.51.1")
}
dependencies {
implementation 'com.google.dagger:dagger-compiler:2.51.1'
ksp 'com.google.dagger:dagger-compiler:2.51.1'
}
./gradlew build
を実行します。生成されたコードはbuild/generated/ksp
ディレクトリにあります。
以下に完全な例を示します。
- Kotlin
- Groovy
plugins {
id("com.google.devtools.ksp") version "2.1.10-1.0.31"
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.1.10-1.0.31'
id 'org.jetbrains.kotlin.jvm' version '2.1.20'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.1.20'
implementation 'com.google.dagger:dagger-compiler:2.51.1'
ksp 'com.google.dagger:dagger-compiler:2.51.1'
}
独自のプロセッサの作成
- 空のgradleプロジェクトを作成します。
- 他のプロジェクトモジュールで使用するために、ルートプロジェクトでKotlinプラグインのバージョン
2.1.10
を指定します。
- Kotlin
- Groovy
plugins {
kotlin("jvm") version "2.1.10" apply false
}
buildscript {
dependencies {
classpath(kotlin("gradle-plugin", version = "2.1.10"))
}
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '2.1.10' apply false
}
buildscript {
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.10'
}
}
-
プロセッサをホストするためのモジュールを追加します。
-
モジュールのビルドスクリプトで、Kotlinプラグインを適用し、KSP APIを
dependencies
ブロックに追加します。
- Kotlin
- Groovy
plugins {
kotlin("jvm")
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:2.1.10-1.0.31")
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '2.1.20'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.google.devtools.ksp:symbol-processing-api:2.1.10-1.0.31'
}
com.google.devtools.ksp.processing.SymbolProcessor
とcom.google.devtools.ksp.processing.SymbolProcessorProvider
を実装する必要があります。SymbolProcessorProvider
の実装は、SymbolProcessor
をインスタンス化するサービスとしてロードされます。 以下の点に注意してください。SymbolProcessorProvider.create()
を実装 してSymbolProcessor
を作成します。プロセッサに必要な依存関係(CodeGenerator
、プロセッサオプションなど)をSymbolProcessorProvider.create()
のパラメータを介して渡します。- メインロジックは
SymbolProcessor.process()
メソッドに記述する必要があります。 - アノテーションの完全修飾名が与えられた場合、
resolver.getSymbolsWithAnnotation()
を使用して処理するシンボルを取得します。 - KSPの一般的なユースケースは、シンボルを操作するためのカスタマイズされたvisitor(インターフェース
com.google.devtools.ksp.symbol.KSVisitor
)を実装することです。シンプルなテンプレートvisitorは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
に含めることで、パッケージにプロセッサプロバイダを登録します。
プロジェクトで独自のプロセッサを使用する
- プロセッサを試したいワークロードを含む別のモジュールを作成します。
- Kotlin
- Groovy
pluginManagement {
repositories {
gradlePluginPortal()
}
}
pluginManagement {
repositories {
gradlePluginPortal()
}
}
- モジュールのビルドスクリプトで、指定されたバージョンの
com.google.devtools.ksp
プラグインを適用し、 プロセッサを依存関係のリストに追加します。
- Kotlin
- Groovy
plugins {
id("com.google.devtools.ksp") version "2.1.10-1.0.31"
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
implementation(project(":test-processor"))
ksp(project(":test-processor"))
}
plugins {
id 'com.google.devtools.ksp' version '2.1.10-1.0.31'
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version'
implementation project(':test-processor')
ksp project(':test-processor')
}
./gradlew build
を実行します。生成されたコードはbuild/generated/ksp
にあります。
以下に、KSPプラグインをワークロードに適用するサンプルビルドスクリプトを示します。
- Kotlin
- Groovy
plugins {
id("com.google.devtools.ksp") version "2.1.10-1.0.31"
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.1.10-1.0.31'
id 'org.jetbrains.kotlin.jvm' version '2.1.20'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib:2.1.20'
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
- Groovy
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およびGradleプラグインでKSPを使用している場合、上記のスクリプトは次の警告を表示します。
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.
この場合は、代わりに次のスクリプトを使用します。
- Kotlin
- Groovy
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')
}
}