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
吗?在shared
或iosMain
内?
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 应用程序的后台线程中运行任务?