为啥 kotlin multiplatform 不执行和导出 iOS 框架?

Posted

技术标签:

【中文标题】为啥 kotlin multiplatform 不执行和导出 iOS 框架?【英文标题】:why kotlin multiplatform don't execute and export iOS framework?为什么 kotlin multiplatform 不执行和导出 iOS 框架? 【发布时间】:2019-05-27 20:32:17 【问题描述】:

我开始开发 kotlin 多平台,并开发了一个简单的测试库。我可以为 android 导出 .jar 文件,但我不能为 ios 导出 .framework 文件。 我查看了其他项目,但没有找到我的问题。

我的 Gradle lib 脚本是:

apply plugin: 'kotlin-multiplatform'

kotlin 
targets 
    final def iOSTarget = 
    System.getenv('SDK_NAME')?.startsWith("iphoneos") \
                          ? presets.iosArm64 : presets.iosX64

    fromPreset(iOSTarget, 'iOS') 
        compilations.main.outputKinds('FRAMEWORK')
    

    fromPreset(presets.jvm, 'android')


sourceSets 
    core.dependencies 
        api 'org.jetbrains.kotlin:kotlin-stdlib-common'
    

    android.dependencies 
        api 'org.jetbrains.kotlin:kotlin-stdlib'
    

【问题讨论】:

【参考方案1】:

您是否添加了构建实际框架的任务?如果没有,请尝试在您的 build.gradle 文件末尾添加此代码:

task packForXCode(type: Sync) 
    final File frameworkDir = new File(buildDir, "xcode-frameworks")
    final String mode = project.findProperty("XCODE_CONFIGURATION")?.toUpperCase() ?: 'DEBUG'

    inputs.property "mode", mode
    dependsOn kotlin.targets.iOS.compilations.main.linkTaskName("FRAMEWORK", mode)

    from  kotlin.targets.iOS.compilations.main.getBinary("FRAMEWORK", mode).parentFile 
    into frameworkDir

    doLast 
        new File(frameworkDir, 'gradlew').with 
            text = "#!/bin/bash\nexport 'JAVA_HOME=$System.getProperty("java.home")'\ncd '$rootProject.rootDir'\n./gradlew \$@\n"
            setExecutable(true)
        
    


tasks.build.dependsOn packForXCode

iOS 框架将在库的build/xcode-frameworks 目录中可用。

您还必须配置您的 Xcode 项目以使用该框架。更多详情可以阅读Setting up Framework Dependency in Xcode。

【讨论】:

没有错误信息。只是不要为 iOS 导出任何内容。 @AlirezaTarazani。没有错误信息?我对此表示怀疑,但请确保任务已实际执行。 添加packForXCode后,您是否正在运行./gradlew :common:packForXCode(假设您的build.gradle位于名为common的目录中)。我可以使用此处发布的代码并运行此命令来使其正常工作。 我在运行 ./gradlew :shared:packForXCode 时收到“在项目中找不到路径为 'linkMainDebugFrameworkIOS' 的任务”。有什么提示吗? 解决了我自己的问题!:packForXCode 和 gradle 中的框架名称不同。【参考方案2】:

“导出框架”是什么意思?您打算从另一个 Gradle 项目、XCode 或其他项目中使用它吗?

附:很抱歉在回答中提问:只是没有足够的声誉来发表评论。所以我认为在GitHub讨论你的问题会更方便。

【讨论】:

以上是关于为啥 kotlin multiplatform 不执行和导出 iOS 框架?的主要内容,如果未能解决你的问题,请参考以下文章

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

Kotlin Multiplatform Cocoapods 集成问题

如何确定 kotlin-multiplatform 项目中的构建类型

KMM(Kotlin Multiplatform Mobile)Welcome to Kotlin/Native World

KMM(Kotlin Multiplatform Mobile)Welcome to Kotlin/Native World

KMM(Kotlin Multiplatform Mobile)Welcome to Kotlin/Native World