KMP中KSP生成的iOS代码无法访问iosMain内容求助
问题:KMP中KSP生成代码无法访问iosMain目录内容
我拥有一个Kotlin Multiplatform(KMP)共享模块,该模块引入KSP库为iOS目标生成代码,生成功能运行正常。但出现异常情况:生成的代码无法访问iosMain目录中的内容(生成代码需导入iosMain内的类)。
我的配置代码如下:
val iosMain by creating { dependsOn(commonMain) dependencies { // ... } } listOf(iosX64, iosArm64, iosSimulatorArm64).forEach { target -> getByName("${target.targetName}Main") { dependsOn(iosMain) } val kspConfigName = "ksp${target.name.replaceFirstChar { it.uppercaseChar() }}" dependencies.add(kspConfigName, "my-ksp-lib") }
请问我哪里配置错误或遗漏了什么?
问题原因与解决方法
你当前的配置只给每个iOS架构目标单独添加了KSP依赖,但KSP的注解处理任务默认只关联对应架构的Main源码集(比如iosX64Main),并没有将iosMain的源码纳入到注解处理的类路径中。虽然iosX64Main等源码集依赖iosMain,但KSP在生成代码时无法自动感知到iosMain里的类,导致生成的代码找不到需要导入的内容。
修复配置
修改你的Gradle配置,在每个iOS目标的循环中,给对应的KSP任务添加iosMain的源码作为输入,确保注解处理阶段能访问到iosMain里的类:
val iosMain by creating { dependsOn(commonMain) dependencies { // ... } } listOf(iosX64, iosArm64, iosSimulatorArm64).forEach { target -> val targetMain = getByName("${target.targetName}Main") targetMain.dependsOn(iosMain) val kspConfigName = "ksp${target.name.replaceFirstChar { it.uppercaseChar() }}" dependencies.add(kspConfigName, "my-ksp-lib") // 关键:让KSP任务包含iosMain的源码 tasks.named("ksp${target.targetName}Kotlin") { source(iosMain) } }
补充方案
如果上述配置仍未解决问题,还可以尝试将iosMain的编译输出添加到KSP任务的类路径中,确保生成代码时能找到iosMain的类文件:
tasks.named("ksp${target.targetName}Kotlin") { classpath += iosMain.output.classesDirs }
这样调整后,KSP在生成代码时就能正常访问iosMain目录下的类了。
内容的提问来源于stack exchange,提问作者GuilhE
相关产品推荐
相关产品推荐

