Gradle 在多平台子项目中使用kapt

Gradle 在多平台子项目中使用kapt,gradle,kotlin,gradle-kotlin-dsl,kotlin-multiplatform,kapt,Gradle,Kotlin,Gradle Kotlin Dsl,Kotlin Multiplatform,Kapt,我有以下项目结构 root-project │ build.gradle.kts │ └───multiplatform-project │ │ build.gradle.kts │ │ │ └───src │ │ kotlin | | js │ └───simple-kotlin-project │ build.gradle.kts 因此总共有3个项目(3个build.gradle.kts文件) 这是根目录项目build

我有以下项目结构

root-project
│   build.gradle.kts
│
└───multiplatform-project
│   │   build.gradle.kts 
│   │
│   └───src
│       │   kotlin
|       |   js
│   
└───simple-kotlin-project
    │   build.gradle.kts
因此总共有3个项目(3个
build.gradle.kts
文件)

  • 这是根目录项目
    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")
        }
    }
    
  • 现在我的问题是如何在多原子项目中实现这一点

    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项目中运行插件一样,将它添加到项目的依赖项中。

    我想你已经找到了你想要的,但是,让我把它贴在这里,供其他可能有兴趣解决这个问题的用户使用

    该问题主要是由
    kapt
    解决Kotlin Gradle插件在kapt名称下注册的
    项目
    扩展引起的。 因此,
    kotlin.sourceset.jvm().compilations[“main”].defaultSourceSet.dependencies
    范围中没有在kapt配置中声明依赖项的扩展

    解决方法包括手动获取配置并向其中添加项目依赖项:

    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”)
    sourceSets {
        val jvmMain by getting {
          dependencies {
            ...
            configurations.get("kapt").dependencies.add(project(":generator"))
          }
        }
    }