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
相关产品推荐
相关产品推荐

