Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gradle 具有公共链接依赖项的多个Kotlin MPP本机库_Gradle_Kotlin_Dynamic Linking_Ios Frameworks_Kotlin Multiplatform - Fatal编程技术网

Gradle 具有公共链接依赖项的多个Kotlin MPP本机库

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框架。它们的类型以前缀命名,这使得来自不同库的类型在消费应用程序中不兼容,即使这些

我有多个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,然后将其包含在复合构建中:

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谢谢,我以前访问过该线程,但当时不在这个阶段,它提供了一些有用的信息。我将尝试一些东西。