我具有以下项目结构
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")
}
}
这是一个简单的kotlin项目,它使用 kapt 并且有效
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!!!
}
现在我的问题是如何在看起来像这样的multiplatorm项目中进行这项工作
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,会出现以下错误:
build.gradle.kts:38:22:类型不匹配:推断的类型为ProjectDependency,但需要采取措施
因此,问题归结为如何在kotlin sourceSet上运行 kapt 插件,方法与在简单的kotlin项目中将其添加到项目的依赖项相同。< / p>
答案 0 :(得分:1)
我认为您已经找到了所需的answer,但是让我在这里发布给其他有兴趣解决此问题的用户。
该问题主要是由kapt
解析为Kotlin Gradle插件以kapt名称注册的Project
扩展名引起的。
因此,kotlin.sourceSets.jvm().compilations["main"].defaultSourceSet.dependencies
范围中无法使用在kapt Configuration中声明依赖项的扩展。
解决方法是手动获取配置并向其中添加项目依赖项:
sourceSets {
val jvmMain by getting {
dependencies {
...
configurations.get("kapt").dependencies.add(project(":generator"))
}
}
}
答案 1 :(得分:0)
对于任何希望将 kapt
依赖项(例如 android 的刀柄编译器)添加到 androidMain sourceSet 的人,您可以:
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"
)
)
}
}
}