【问题标题】:Using kapt with multiplatform subproject将 kapt 与多平台子项目一起使用
【发布时间】: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 文件)。

  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 并且 有效

    的简单 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. 现在我的问题是如何在看起来像这样的多平台项目中进行这项工作

    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 项目中通过将其添加到项目的依赖项中一样。

【问题讨论】:

    标签: gradle kotlin gradle-kotlin-dsl kotlin-multiplatform kapt


    【解决方案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"
                    )
                )
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2023-03-14
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2021-11-24
      • 2020-09-05
      相关资源
      最近更新 更多