Kotlin多平台库:无法为iOS生成.framework

时间:2020-10-12 11:19:19

标签: ios kotlin kotlin-multiplatform

我是Android / KotlinMultiplatform的新手,我正在尝试使用Kotlin Multiplatform为iOS / Android创建一个库。

当我在终端上运行命令时 ./gradlew :shared:packForXcode 它成功,但是在根文件夹内找不到/build/xcode-frameworks文件夹。

有人可以帮我找出问题所在吗??

IntelliJ CE版本:2020.2.3

我的Gradle文件内容:

plugins {
    id("org.jetbrains.kotlin.multiplatform") version "1.4.10"
    id("com.android.library")
    id("kotlin-android-extensions")
    "maven-publish"
}
repositories {
    mavenCentral()
}

group "me.myname"
version "0.0.1"

kotlin {
    targets {
        android()
        ios {
            binaries {
                framework {
                    baseName = "MyLib"
                }
            }
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
            }
        }
        val androidMain by getting {
            dependencies { }
        }
        val iosMain by getting {
            dependencies { }
        }
    }

}

android {
    compileSdkVersion(29)
    defaultConfig {
        minSdkVersion(24)
        targetSdkVersion(29)
        versionCode = 1
        versionName = "1.0"
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
        }
    }
}

val packForXcode by tasks.creating(Sync::class) {
    val targetDir = File(buildDir, "xcode-frameworks")

    /// selecting the right configuration for the iOS
    /// framework depending on the environment
    /// variables set by Xcode build
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName: String? = System.getenv("SDK_NAME")
    val isiOSDevice = sdkName.orEmpty().startsWith("iphoneos")

    val framework = kotlin.targets
        .getByName<KotlinNativeTarget>(
            if(isiOSDevice) {
                "iosArm64"
            } else {
                "iosX64"
            }
        )
        .binaries.getFramework(mode)

    inputs.property("mode", mode)
    dependsOn(framework.linkTask)

    from({ framework.outputDirectory })
    into(targetDir)

    println("Build Folder => $targetDir")

    /// generate a helpful ./gradlew wrapper with embedded Java path
    doLast {
        val gradlew = File(targetDir, "gradlew")
        gradlew.writeText("#!/bin/bash\n"
                + "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
                + "cd '${rootProject.rootDir}'\n"
                + "./gradlew \$@\n")
        gradlew.setExecutable(true)
    }
}

tasks.build.dependsOn("packForXCode")

更新

  1. 使用IntelliJ IDEA创建的项目,如下截图:

enter image description here

  1. 我的项目结构如下:

enter image description here

2 个答案:

答案 0 :(得分:1)

我只能使用来查看屏幕截图的模板

IntelliJ 2020.2.3 Ultimate

此模板默认情况下未设置packForXcode任务,所以我想应该手动将其放置。

无论如何,对于具有 cleaned 的项目,如果运行它,则可以在要放置它的build文件夹中拥有调试框架。

enter image description here

您当然应该至少有一个源(Greeting.kt)文件,就像我在图片中向您显示的文件一样。

我建议您深入研究从herehere开始的文档。

答案 1 :(得分:0)

如果我没记错的话,此任务并非旨在手动执行。应该将其作为Xcode项目构建的一部分来触发,请参见documentation。请尝试按照文档中的步骤进行操作,并查看框架是否可以通过Xcode连接并正常工作。