You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin多平台项目中配置KSP输出目录至commonMain的问题

在Kotlin多平台项目中配置KSP生成代码到commonMain

问题原因

你当前的ksp.outputDir配置不生效,核心原因是KMP中每个源集对应的KSP任务是独立的,全局ksp块的参数不会自动传递给处理commonMain元数据的kspCommonMainMetadata任务。另外,直接将生成代码写入src/commonMain目录不是最佳实践,应该放到build目录下,再让commonMain源集引用该路径。

正确配置方式

1. 配置KSP生成目录到commonMain专属build路径

针对kspCommonMainMetadata任务设置输出目录,确保生成的代码指向commonMain对应的build路径:

tasks.withType(com.google.devtools.ksp.gradle.KspTask::class) {
    if (name.contains("CommonMainMetadata")) {
        outputDir.set(file("${project.buildDir}/generated/ksp/common/commonMain/kotlin"))
    }
}

2. 让commonMain源集识别生成的代码

将上述生成目录添加到commonMain的源码路径中,确保Kotlin编译器能识别这些自动生成的代码:

kotlin {
    sourceSets {
        commonMain {
            kotlin.srcDir("${project.buildDir}/generated/ksp/common/commonMain/kotlin")
        }
    }
}

3. 调整依赖配置

只在需要的KSP任务中声明代码生成器依赖,避免冗余:

dependencies {
    add("kspCommonMainMetadata", project(":ksp"))
    add("kspJvm", project(":ksp"))
    // 若不需要在JVM测试中生成代码,可移除kspJvmTest依赖
    // add("kspJvmTest", project(":ksp"))
}

完整修正后的配置示例

plugins {
    kotlin("multiplatform")
    id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20-RC"
    id("com.google.devtools.ksp")
}

kotlin {
    jvm()
    js(IR) {
        browser {
            binaries.executable()
            distribution {
                outputDirectory = File("${projectDir}/build/distributions")
            }
        }
    }
    sourceSets {
        val jsMain by getting {
            dependencies {
                implementation(kotlin("stdlib-js"))
                implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
            }
        }
        val commonMain by getting {
            kotlin.srcDir("${project.buildDir}/generated/ksp/common/commonMain/kotlin")
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.0")
                implementation(kotlin("stdlib-common"))
            }
            // 若代码生成器需要自定义参数,在此添加
            // ksp {
            //     arg("custom.param", "value")
            // }
        }
        val jvmMain by getting {
            dependencies {
                implementation(kotlin("reflect"))
                implementation(kotlin("stdlib-jdk8"))
                // JVM端无需直接依赖ksp模块,除非有特殊业务需求
                // implementation(project(":ksp"))
            }
        }
    }
}

dependencies {
    add("kspCommonMainMetadata", project(":ksp"))
    add("kspJvm", project(":ksp"))
}

tasks.withType(com.google.devtools.ksp.gradle.KspTask::class) {
    if (name.contains("CommonMainMetadata")) {
        outputDir.set(file("${project.buildDir}/generated/ksp/common/commonMain/kotlin"))
    }
}

关键说明

  • 不要直接将生成代码写入src/commonMain目录,避免自动生成代码混入手动源码,影响版本控制和构建清洁。
  • kspCommonMainMetadata是专门处理commonMain源集代码生成的任务,配置它的输出目录才能让生成的代码被commonMain识别,进而供jsMain等其他源集复用。

内容的提问来源于stack exchange,提问作者bsautner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:36:09