У меня есть несколько Kotlin MPP-проектов, которые я хочу скомпилировать и использовать как отдельные библиотеки в iOS и Android. Проекты MPP имеют свои собственные файлы build.gradle и объединяются в составную структуру сборки, поэтому одна задача создает их все. Это хорошо работает для строительства банок. Фреймворки iOS также построены, но не так, как мне бы хотелось.
Существует структура зависимостей среди библиотек, например, базовая библиотека, которую используют все остальные, и другая, которая ссылается на все остальные, и некоторые промежуточные. При компиляции библиотек они представляют собой толстые фреймворки, содержащие все их зависимости. Их типы именуются с префиксом в соответствии с их Kotlin именем проекта , что делает типы из разных библиотек несовместимыми в потребляющем приложении, даже если типы одинаковы в Kotlin.
Вот пример: допустим, у нас есть App, Lib_A и Lib_B. В Kotlin common_main Lib_A ссылается на lib_b.Clazz из Lib_B. В Android на один и тот же lib_b.Clazz можно ссылаться как из Lib_B и приложения, так и между Lib_A и Lib_B. Однако в iOS, поскольку пространства имен не существует, Clazz называется Lib_ALib_BClazz в Lib_A и LibBClazz в Lib_B. Для приложения это разные типы, поэтому их нельзя использовать вместе. Кроме того, в скомпилированных iOS фреймворках все видимые транзитивные зависимости включены в каждую фреймворк.
Вопрос : есть ли способ в Gradle сказать плагину MPP, что он не должен включать все зависимости в каждом скомпилированном iOS каркасе, так что я могу вместо этого предоставить их все из приложения, и их типы будут совместимы?
Вот базовый c build.gradle для каждого Kotlin проекта MPP, который затем включается в составную сборку:
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