未解决的参考 iosMain Kotlin Multiplatform

Cot*_*tel 5 android gradle kotlin kotlin-multiplatform kotlin-multiplatform-mobile

我有一个其他 KMM 项目正在使用的 Kotlin 多平台库。我正在尝试构建这些 KMM 项目之一的 iOS 应用程序,但首先我需要将库二进制文件发布到 Maven 存储库。

Unresolved reference当尝试构建 iOS ARM 64 二进制文件时,我正在使用的库之一失败了。它仅在 gradle task 上失败compileIosMainKotlinMetadata,构建项目工作完美,但由于此错误,我无法生成二进制文件。

这是我常见的多平台 lib 设置 gradle:( kotlin-multiplatform-lib-setup)

plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

kotlin {
    android {
        publishAllLibraryVariants()
    }
    ios()

    sourceSets {
         commonTest {
             dependencies {
                 implementation(kotlin("test-common"))
                 implementation(kotlin("test-annotations-common"))
             }
         }

        val androidTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
                implementation("junit:junit:4.13.2")
            }
        }
    }

    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }
}

android {
    compileSdkVersion(31)

    defaultConfig {
        minSdkVersion(23)
        targetSdkVersion(31)
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    sourceSets {
        named("main") {
            manifest.srcFile("src/androidMain/AndroidManifest.xml")
            res.srcDirs("src/androidMain/res")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在开发的模块的 build.gradle.kts:

plugins {
    id("kotlin-multiplatform-lib-setup")
    id("publish-setup")
}

publishing {
    publications.withType<MavenPublication> {
        groupId = "${Constants.artifactGroup}.architecture"
        artifactId = "core"
        version = Constants.artifactVersion
    }
}

kotlin {
    ios()

    sourceSets {
        commonMain {
            dependencies {
                implementation(Deps.Badoo.reaktive)
                implementation(Deps.Badoo.coroutinesInterop)
                implementation(Deps.KotlinX.Coroutines.core)
                implementation(Deps.uuid)
            }
        }

        commonTest {
            dependencies {
                implementation(Deps.Badoo.reaktive)
                implementation(Deps.KotlinX.Coroutines.core)
                implementation(Deps.Badoo.reaktiveTesting)
            }
        }

        iosMain {
            dependencies {
                implementation(Deps.Badoo.reaktive)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也测试过添加没有结果

kotlin {
  ios {
        binaries {
            framework { 
                export(Deps.Badoo.reaktive)
                transitiveExport = true
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 2

默认情况下,模块的 build.gradle 中不提供 iosMain 源集。因此,不要添加ios()到源集,而是添加三个 iOS 配置

iosX64()
iosArm64()
iosSimulatorArm64()
Run Code Online (Sandbox Code Playgroud)

并且不只是为 iosMain 提供依赖项,而是包含所有配置

iosMain {
    dependencies {
        implementation(Deps.Badoo.reaktive)
    }
}
Run Code Online (Sandbox Code Playgroud)

改为这样做,

val iosX64Main by getting
val iosArm64Main by getting
val iosSimulatorArm64Main by getting
val iosMain by creating {
    dependsOn(commonMain)
    iosX64Main.dependsOn(this)
    iosArm64Main.dependsOn(this)
    iosSimulatorArm64Main.dependsOn(this)

    dependencies {
        implementation(Deps.Badoo.reaktive)
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,它添加了一个新的通用依赖源集来处理所有 iOS 配置。