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

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
    }
}

关键改动说明

  1. 移除手动创建iosMain的代码:依赖targetHierarchy.default()自动生成的源集,避免重复创建冲突
  2. 删除iOS target循环中的依赖配置:统一在sourceSets中管理所有平台依赖,符合KMM项目规范
  3. 简化源集依赖关系:targetHierarchy.default()已经自动处理了iOS各架构源集对iosMain的依赖,无需手动设置dependsOn

内容的提问来源于stack exchange,提问作者Tippu Fisal Sheriff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:29:55