Gradle 具有公共链接依赖项的多个Kotlin MPP本机库
我有多个Kotlin MPP项目,我想在iOS和Android中编译并作为单独的库使用。MPP项目有自己的build.gradle文件,并被合并到一个复合构建结构中,因此一个任务可以构建所有这些文件。这对建造罐子很有效。iOS框架也是构建的,但不是我想要的方式 这些库之间有一个依赖关系结构,例如所有其他库使用的核心库和引用所有其他库的核心库,以及介于两者之间的一些核心库。在编译这些库时,它们是包含所有依赖项的fat框架。它们的类型以前缀命名,这使得来自不同库的类型在消费应用程序中不兼容,即使这些类型在Kotlin中是相同的 这里有一个例子:假设我们有应用程序Lib_A和Lib_B。在Kotlin common_main中,Lib_A引用Lib_B的Lib_B.Clazz。在Android中,Lib_B和应用程序以及Lib_A和Lib_B之间都可以引用相同的Lib_B.Clazz。但是,在iOS中,由于名称空间不存在,Clazz在Lib_A中被称为Lib_ALib_BClazz,在Lib_B中被称为Lib_ALib_BClazz。因此,对于应用程序来说,它们是不同的类型,不能一起使用。此外,在已编译的iOS框架中,所有可见的过渡依赖项都包含在每个框架中 问题:Gradle是否有办法告诉MPP插件不要在每个已编译的iOS框架中包含所有依赖项,这样我就可以从应用程序提供所有依赖项,并且它们的类型将是兼容的 以下是每个Kotlin MPP项目的基本build.gradle,然后将其包含在复合构建中:Gradle 具有公共链接依赖项的多个Kotlin MPP本机库,gradle,kotlin,dynamic-linking,ios-frameworks,kotlin-multiplatform,Gradle,Kotlin,Dynamic Linking,Ios Frameworks,Kotlin Multiplatform,我有多个Kotlin MPP项目,我想在iOS和Android中编译并作为单独的库使用。MPP项目有自己的build.gradle文件,并被合并到一个复合构建结构中,因此一个任务可以构建所有这些文件。这对建造罐子很有效。iOS框架也是构建的,但不是我想要的方式 这些库之间有一个依赖关系结构,例如所有其他库使用的核心库和引用所有其他库的核心库,以及介于两者之间的一些核心库。在编译这些库时,它们是包含所有依赖项的fat框架。它们的类型以前缀命名,这使得来自不同库的类型在消费应用程序中不兼容,即使这些
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.3.61'
}
repositories {
mavenCentral()
mavenLocal()
jcenter()
google()
maven { url "https://kotlin.bintray.com/kotlinx" }
maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" }
}
apply plugin: 'maven-publish'
kotlin {
iosArm64 {
binaries.framework {
baseName = project.name
}
}
iosX64 {
binaries.framework {
baseName = project.name
}
}
sourceSets {
commonMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.2'
implementation 'Lib_B' // example
implementation 'Lib_C' // example
}
}
iosArm64Main {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.2'
}
}
iosX64Main {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.2'
}
}
}
}
task runBuildIosArm64(type: GradleBuild) {
buildFile = 'ProjectName/build.gradle'
tasks = ['linkReleaseFrameworkIos']
startParameter.setProjectProperties([
'IOS_TARGET': 'iosArm64',
'XCODE_CONFIGURATION': 'RELEASE'
])
}
task runBuildIosX64(type: GradleBuild) {
buildFile = 'ProjectName/build.gradle'
tasks = ['linkReleaseFrameworkIos']
startParameter.setProjectProperties([
'IOS_TARGET': 'iosX64',
'XCODE_CONFIGURATION': 'RELEASE'
])
}
task cleanFrameworksFolder(type: Delete) {
delete 'ProjectName/build/xcode-frameworks'
}
task combineIosArchitectures(type: Exec) {
executable 'lipo'
args = [
'-create',
'-arch', 'arm64', 'ProjectName/build/xcode-frameworks/ProjectName_iosArm64.framework/ProjectName',
'-arch', 'x86_64', 'ProjectName/build/xcode-frameworks/ProjectName_iosX64.framework/ProjectName',
'-output', 'ProjectName/build/xcode-frameworks/ProjectName.framework/ProjectName',
]
}
combineIosArchitectures.dependsOn cleanFrameworksFolder
combineIosArchitectures.dependsOn runBuildIosArm64
combineIosArchitectures.dependsOn runBuildIosX64
您是在iOS中包含多个框架,还是从多个Kotlin库生成一个框架?到目前为止,这些框架是单独包含的。每个Kotlin项目都有上面的Gradle脚本。似乎相关:@ArtyomDegtyarev谢谢,我以前访问过该线程,但当时不在这个阶段,它提供了一些有用的信息。我将尝试一些东西。