【问题标题】:Kotlin Multiplatform Cocoapods integration issueKotlin Multiplatform Cocoapods 集成问题
【发布时间】:2021-07-07 12:36:11
【问题描述】:

所以我尝试使用 kotlin 多平台构建项目,我设法与数据库/ktor 等集成,但问题是当我需要一些来自 cocoapods 的依赖时。我已经看到从 kotlin 1.4 xcode 开始不需要构建这样的依赖项(但是即使它失败了,除非我在我的机器上安装了 xcode)。但重点是,每次我在build.gradle.kts 中的cocoapods 中添加pod 部分时,我的同步都会失败:

Exception in thread "main" java.lang.Error: /var/folders/6p/0kpnx2mj22589gthf1dddjwhtr2_tq/T/15810392041507337443.m:1:9: fatal error: module 'AFNetworking' not found
    at org.jetbrains.kotlin.native.interop.indexer.UtilsKt.ensureNoCompileErrors(Utils.kt:152)
    at org.jetbrains.kotlin.native.interop.indexer.ModuleSupportKt.getModulesASTFiles(ModuleSupport.kt:68)
    at org.jetbrains.kotlin.native.interop.indexer.ModuleSupportKt.getModulesInfo(ModuleSupport.kt:14)
    at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.buildNativeLibrary(main.kt:506)
    at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.processCLib(main.kt:264)
    at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.interop(main.kt:74)
    at org.jetbrains.kotlin.cli.utilities.InteropCompilerKt.invokeInterop(InteropCompiler.kt:45)
    at org.jetbrains.kotlin.cli.utilities.MainKt.mainImpl(main.kt:19)
    at org.jetbrains.kotlin.cli.utilities.MainKt.main(main.kt:41)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':example:cinteropAFNetworkingIos'.
> Process 'command '/Applications/Android Studio 4.2 Preview.app/Contents/jre/jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

当我启动 podspec 时,它会正确生成,我的构建 gradle 文件: 第一:

buildscript {
    ext.kotlin_version = "1.4.31"
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.0-beta06"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-serialization:1.4.31"
        classpath "com.squareup.sqldelight:gradle-plugin:1.4.4"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
        maven { url "https://kotlin.bintray.com/kotlinx" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

还有那个有cocoapods的:

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    kotlin("plugin.serialization")
    kotlin("native.cocoapods")
    id("com.android.library")
    id("kotlin-android-extensions")
    id("com.squareup.sqldelight")
}

kotlin {
    android()

    val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
        if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
            ::iosArm64
        else
            ::iosX64

    iOSTarget("ios") {}
    version = "1.0.0"
    cocoapods {
        summary = "This is sample Summary"
        homepage = "Home URL"

        pod("AFNetworking")
        pod("FirebaseAnalytics")
    }

    val coroutinesVersion = "1.3.9-native-mt"
    val serializationVersion = "1.0.0-RC"
    val ktorVersion = "1.5.3"
    val sqlDelightVersion = "1.4.4"

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:$serializationVersion")
                implementation("io.ktor:ktor-client-core:$ktorVersion")
                implementation("io.ktor:ktor-client-serialization:$ktorVersion")
                implementation("com.squareup.sqldelight:runtime:$sqlDelightVersion")
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("androidx.core:core-ktx:1.3.2")
                implementation("io.ktor:ktor-client-android:$ktorVersion")
                implementation("com.squareup.sqldelight:android-driver:$sqlDelightVersion")
                implementation("com.jakewharton.timber:timber:4.7.1")
            }
        }
        val iosMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-ios:$ktorVersion")
                implementation("com.squareup.sqldelight:native-driver:$sqlDelightVersion")
            }
        }
    }
}

android {
    compileSdkVersion(29)
    defaultConfig {
        minSdkVersion(24)
        targetSdkVersion(29)
    }
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
}

也许有人已经找到了解决方案?

【问题讨论】:

    标签: kotlin-multiplatform


    【解决方案1】:

    你跑pod install了吗?

    Gradle 需要源代码来生成 kotlin 头文件。

    因此,在向 gradle 文件添加新的 pod 依赖项后,您需要运行第一次同步,这将失败,但它会更新您的 podspec 文件。然后你需要运行pod install获取源代码,然后再次运行同步。

    【讨论】:

    • 我做了,首先我做sync 如果失败,podspec 文件被生成并且依赖项在那里,然后我运行pod install 不是来自shared,而是来自iosApp只有一个Podfile,然后同步再次失败-也许这就是问题所在?我的共享代码中应该有Podfile 吗?在sharediosMain 内?
    • Podfile 应该在您的 iOS 应用目录中,这是正确的。因此,当您运行pod install 时,您在 gradle 文件中提到的模块会被安装吗?在控制台中你应该看到Installing AFNetworking,你也可以在安装后检查你是否有iosApp/Pods/AFNetworking文件夹和代码
    • @user2141889 你能提供一个有这个问题的示例项目吗?到目前为止,您附加到问题的代码看起来不错
    • 它确实说Installing AFNetworking 并且AFNetworking 里面有iosApp/Pods 但是仍然与module not found 同步失败
    • 在将 gradle 插件版本更新到 7.0.0-alpha14(因为我使用的是 AS 的金丝雀版本)和 gradle 到 7.0(这是最新金丝雀版本的要求)之后,同步进行得很好我的机器。我不确定这是否是问题所在,但尝试将 AS 更新到 4.2 RC 1,并将 gradle 更新到 7.0,也许这会起作用。
    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2019-08-20
    • 2019-11-27
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2020-04-28
    • 2017-05-28
    相关资源
    最近更新 更多