KMM添加Ktor库时遇错误:iosMain源码集已存在
KMM添加Ktor库时"iosMain已存在"错误的解决办法
报错信息
Cannot add a KotlinSourceSet with name 'iosMain' as a KotlinSourceSet with that name already exists.
问题原因
你启用了targetHierarchy.default()配置,这个配置会自动生成iosMain源集,并自动让iosX64Main、iosArm64Main、iosSimulatorArm64Main这三个源集依赖iosMain。但你又手动通过val iosMain by creating创建了同名源集,导致重复冲突;同时在iOS target循环里添加的依赖也是多余的,会造成依赖管理混乱。
修改后的完整Gradle配置
plugins { kotlin("multiplatform") id("com.android.library") id("org.jetbrains.compose") } @OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) kotlin { targetHierarchy.default() android { compilations.all { kotlinOptions { jvmTarget = "1.8" } } } listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" isStatic = true } } sourceSets { val ktorVersion = "2.3.5" val commonMain by getting { dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material) @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) implementation(compose.components.resources) implementation("io.ktor:ktor-client-core:$ktorVersion") } } val androidMain by getting { dependencies { implementation("io.ktor:ktor-client-okhttp:$ktorVersion") } } // 直接获取自动生成的iosMain源集,添加Ktor依赖 val iosMain by getting { dependencies { implementation("io.ktor:ktor-client-darwin:$ktorVersion") } } val iosX64Main by getting val iosArm64Main by getting val iosSimulatorArm64Main by getting val commonTest by getting { dependencies { implementation(kotlin("test")) } } } } android { namespace = "com.tippu.sheriff" compileSdk = 33 defaultConfig { minSdk = 24 } }
关键改动说明
- 移除手动创建
iosMain的代码:依赖targetHierarchy.default()自动生成的源集,避免重复创建冲突 - 删除iOS target循环中的依赖配置:统一在
sourceSets中管理所有平台依赖,符合KMM项目规范 - 简化源集依赖关系:
targetHierarchy.default()已经自动处理了iOS各架构源集对iosMain的依赖,无需手动设置dependsOn
内容的提问来源于stack exchange,提问作者Tippu Fisal Sheriff
相关产品推荐
相关产品推荐

