将 kapt 与多平台子项目一起使用
Using kapt with multiplatform subproject
我有以下项目结构
root-project
│ build.gradle.kts
│
└───multiplatform-project
│ │ build.gradle.kts
│ │
│ └───src
│ │ kotlin
| | js
│
└───simple-kotlin-project
│ build.gradle.kts
所以总共有3个项目(3个build.gradle.kts
个文件)。
这里是 root 项目 build.gradle.kts
plugins {
kotlin("jvm") version kotlinVersion apply false
kotlin("kapt") version kotlinVersion apply false
kotlin("multiplatform") version kotlinVersion apply false
}
subprojects {
apply<JavaPlugin>()
if (name.contains("multiplatform-project")) {
apply(plugin = "org.jetbrains.kotlin.multiplatform")
} else {
apply(plugin = "kotlin")
}
apply(plugin = "kotlin-kapt")
dependencies {
implementation(kotlin("stdlib"))
implementation(kotlin("reflect"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2")
implementation("org.slf4j:slf4j-api:1.7.25")
implementation("ch.qos.logback:logback-core:1.2.3")
implementation("ch.qos.logback:logback-classic:1.2.3")
testImplementation("junit:junit:$jUnitVersion")
}
}
这是使用 kapt 并且 works
的简单 kotlin 项目
val jacksonVersion: String by project
dependencies {
implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion")
kapt(project(":generator")) // THIS WORKS!!!
}
现在我的问题是如何在看起来像这样的 multiplatorym 项目中完成这项工作
val jacksonVersion: String by project
val ktorVersion: String by project
kotlin {
jvm {
val main by compilations.getting {
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
compileKotlinTask
output
}
}
js {}
sourceSets {
val jvmMain by getting {
dependencies {
implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion")
implementation("io.ktor:ktor-html-builder:$ktorVersion")
implementation("io.ktor:ktor-server-netty:$ktorVersion")
kapt(project(":generator")) // THIS DOESN'T WORK!!!
}
}
}
}
这是我在 IDEA 中看到的错误
这不是幻影错误。如果我 运行 gradle 构建,我会收到以下错误:
build.gradle.kts:38:22: Type mismatch: inferred type is ProjectDependency but Action was expected
所以,问题归结为我如何 运行 kapt kotlin sourceSet 上的插件,就像我在一个简单的 kotlin 项目中一样将其添加到项目的依赖项中。
我认为您已经找到了您要找的 answer,但让我 post 在这里为可能有兴趣解决此问题的任何其他用户提供它。
问题主要是由于 kapt
解析到 Kotlin Gradle 插件在 kapt 名称下注册的 Project
扩展。
因此,在 kapt 配置中声明依赖项的扩展在 kotlin.sourceSets.jvm().compilations["main"].defaultSourceSet.dependencies
范围内不可用。
解决方法是手动获取配置并向其添加项目依赖项:
sourceSets {
val jvmMain by getting {
dependencies {
...
configurations.get("kapt").dependencies.add(project(":generator"))
}
}
}
对于希望向 androidMain sourceSet 添加 kapt
依赖项(例如 android 的 hilt-compiler)的任何人,您可以:
sourceSets {
val androidMain by getting {
dependencies {
// declare the implementation for the compiler
implementation("com.google.dagger:hilt-compiler:2.37")
// configure kapt to utilize
configurations.getByName("kapt").dependencies.add(
DefaultExternalModuleDependency(
"com.google.dagger",
"hilt-compiler",
"2.37"
)
)
}
}
}
我有以下项目结构
root-project
│ build.gradle.kts
│
└───multiplatform-project
│ │ build.gradle.kts
│ │
│ └───src
│ │ kotlin
| | js
│
└───simple-kotlin-project
│ build.gradle.kts
所以总共有3个项目(3个build.gradle.kts
个文件)。
这里是 root 项目
build.gradle.kts
plugins { kotlin("jvm") version kotlinVersion apply false kotlin("kapt") version kotlinVersion apply false kotlin("multiplatform") version kotlinVersion apply false } subprojects { apply<JavaPlugin>() if (name.contains("multiplatform-project")) { apply(plugin = "org.jetbrains.kotlin.multiplatform") } else { apply(plugin = "kotlin") } apply(plugin = "kotlin-kapt") dependencies { implementation(kotlin("stdlib")) implementation(kotlin("reflect")) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2") implementation("org.slf4j:slf4j-api:1.7.25") implementation("ch.qos.logback:logback-core:1.2.3") implementation("ch.qos.logback:logback-classic:1.2.3") testImplementation("junit:junit:$jUnitVersion") } }
这是使用 kapt 并且 works
的简单 kotlin 项目val jacksonVersion: String by project dependencies { implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion") kapt(project(":generator")) // THIS WORKS!!! }
现在我的问题是如何在看起来像这样的 multiplatorym 项目中完成这项工作
val jacksonVersion: String by project val ktorVersion: String by project kotlin { jvm { val main by compilations.getting { kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } compileKotlinTask output } } js {} sourceSets { val jvmMain by getting { dependencies { implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") implementation("io.ktor:ktor-html-builder:$ktorVersion") implementation("io.ktor:ktor-server-netty:$ktorVersion") kapt(project(":generator")) // THIS DOESN'T WORK!!! } } } }
这是我在 IDEA 中看到的错误
这不是幻影错误。如果我 运行 gradle 构建,我会收到以下错误:
build.gradle.kts:38:22: Type mismatch: inferred type is ProjectDependency but Action was expected
所以,问题归结为我如何 运行 kapt kotlin sourceSet 上的插件,就像我在一个简单的 kotlin 项目中一样将其添加到项目的依赖项中。
我认为您已经找到了您要找的 answer,但让我 post 在这里为可能有兴趣解决此问题的任何其他用户提供它。
问题主要是由于 kapt
解析到 Kotlin Gradle 插件在 kapt 名称下注册的 Project
扩展。
因此,在 kapt 配置中声明依赖项的扩展在 kotlin.sourceSets.jvm().compilations["main"].defaultSourceSet.dependencies
范围内不可用。
解决方法是手动获取配置并向其添加项目依赖项:
sourceSets {
val jvmMain by getting {
dependencies {
...
configurations.get("kapt").dependencies.add(project(":generator"))
}
}
}
对于希望向 androidMain sourceSet 添加 kapt
依赖项(例如 android 的 hilt-compiler)的任何人,您可以:
sourceSets {
val androidMain by getting {
dependencies {
// declare the implementation for the compiler
implementation("com.google.dagger:hilt-compiler:2.37")
// configure kapt to utilize
configurations.getByName("kapt").dependencies.add(
DefaultExternalModuleDependency(
"com.google.dagger",
"hilt-compiler",
"2.37"
)
)
}
}
}