将 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个文件)。

  1. 这里是 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")
        }
    }
    
  2. 这是使用 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!!!
    }
    
  3. 现在我的问题是如何在看起来像这样的 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"
                )
            )
        }
    }
}