Kotlin Multiplatform Cocoapods 集成问题

Posted

技术标签:

【中文标题】Kotlin Multiplatform Cocoapods 集成问题【英文标题】:Kotlin Multiplatform Cocoapods integration issue 【发布时间】: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")

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

【问题讨论】:

【参考方案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,也许这会起作用。

以上是关于Kotlin Multiplatform Cocoapods 集成问题的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin-multiplatform:如何执行 iOS 单元测试

在 kotlin-multiplatform 上生成 UUID?

Kotlin Multiplatform 项目包含 cocoapod 依赖项

如何使用 Kotlin-Multiplatform 在 iOS 应用程序的后台线程中运行任务?

如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟

Kotlin Multiplatform Android Imports 无法解决