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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:32:51