Kotlin 多平台库:无法为 iOS 生成 .framework
Kotlin Multiplatform Library: Unable to generate .framework for iOS
我是 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")
更新
- 使用IntelliJ IDEA创建的项目,如下截图:
- 我的项目结构如下所示:
如果我没记错的话,这个任务不是设计来手动执行的。它应该作为 Xcode 项目构建的一部分触发,请参见 documentation。请尝试按照文档中的步骤进行操作,并查看框架是否可以从 Xcode.
连接并正常工作
我只能使用
才能看到您的屏幕截图模板
IntelliJ 2020.2.3 旗舰版
默认情况下,此模板没有设置 packForXcode
任务,因此我想您应该手动设置它。
无论如何,对于 cleaned 项目,如果你 运行 它,你可以在你想要的 build
文件夹中拥有调试框架它。
当然,您应该至少有一个源 (Greeting.kt
) 文件,就像我在图片中向您展示的那样。
我是 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")
更新
- 使用IntelliJ IDEA创建的项目,如下截图:
- 我的项目结构如下所示:
如果我没记错的话,这个任务不是设计来手动执行的。它应该作为 Xcode 项目构建的一部分触发,请参见 documentation。请尝试按照文档中的步骤进行操作,并查看框架是否可以从 Xcode.
连接并正常工作我只能使用
才能看到您的屏幕截图模板IntelliJ 2020.2.3 旗舰版
默认情况下,此模板没有设置 packForXcode
任务,因此我想您应该手动设置它。
无论如何,对于 cleaned 项目,如果你 运行 它,你可以在你想要的 build
文件夹中拥有调试框架它。
当然,您应该至少有一个源 (Greeting.kt
) 文件,就像我在图片中向您展示的那样。