将 kapt 与多平台子项目一起使用
Posted
技术标签:
【中文标题】将 kapt 与多平台子项目一起使用【英文标题】:Using kapt with multiplatform subproject 【发布时间】:2020-04-06 20:43:53 【问题描述】:我有以下项目结构
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 并且 有效
的简单 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!!!
现在我的问题是如何在看起来像这样的多平台项目中进行这项工作
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 项目中通过将其添加到项目的依赖项中一样。
【问题讨论】:
【参考方案1】:我想您已经找到了您正在寻找的answer,但让我将其发布在此处,以供可能有兴趣解决此问题的任何其他用户使用。
该问题主要是由 Kotlin Gradle 插件将 kapt
解析为在 kapt 名称下注册的 Project
扩展名引起的。
因此,在 kapt 配置中声明依赖项的扩展在 kotlin.sourceSets.jvm().compilations["main"].defaultSourceSet.dependencies
范围内不可用。
解决方法是手动获取配置并向其添加项目依赖项:
sourceSets
val jvmMain by getting
dependencies
...
configurations.get("kapt").dependencies.add(project(":generator"))
【讨论】:
如果您使用 Gradle kotlin 脚本,您将不得不做一些稍微不同的事情:configurations["kapt"].dependencies.add(project.dependencies.create("com.example:foo:1.0"))
【参考方案2】:
对于希望将kapt
依赖项(例如android 的hilt-compiler)添加到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"
)
)
【讨论】:
以上是关于将 kapt 与多平台子项目一起使用的主要内容,如果未能解决你的问题,请参考以下文章
带有 Java 和 Kotlin 文件、kapt 或 annotationProcessor 的 Android 项目?