gradle 无法正确生成KMP库并在KMM库项目中使用它

zhte4eai  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(169)

我目前正在进行一个项目,该项目实现了以下步骤:
1.使用开放API生成器和摇摆描述文件为API生成KMP项目
1.打包common、jvm和iOS库
1.创建KMM项目
1.添加并使用在步骤2中生成的库
步骤1工作正常。
对于第2步,我使用assemble gradle任务,该任务在build/libs文件夹中生成以下二进制文件:

  • kotlin-client-iosarm64-1.0.0-metadata.jar
  • kotlin-client-iosx64-1.0.0-metadata.jar
  • kotlin-client-js-1.0.0.jar
  • kotlin-client-jvm-1.0.0.jar
  • kotlin-client-metadata-1.0.0.jar

对于步骤3,我使用Android Studio和JetBrains的“Kotlin多平台移动的”插件,并选择“Kotlin多平台库”模板。
目前,我没有将生成的二进制文件部署到maven存储库中,因此在第4步中,我将jar文件复制/粘贴到“libs”文件夹中,并将其引用到build.gradle.kts文件中:

sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.3")

                implementation("io.ktor:ktor-client-core:2.1.3")
                implementation("io.ktor:ktor-client-serialization:2.1.3")
                implementation("io.ktor:ktor-client-content-negotiation:2.1.3")
                implementation("io.ktor:ktor-serialization-kotlinx-json:2.1.3")

                implementation(files("libs/kotlin-client-metadata-1.0.0.jar"))
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("io.ktor:ktor-client-cio-jvm:2.1.3")
                implementation(files("libs/kotlin-client-jvm-1.0.0.jar"))
            }
        }
        val androidUnitTest by getting
        val iosX64Main by getting {
            dependencies {
                implementation("io.ktor:ktor-client-ios:2.1.3")
                implementation(files("libs/kotlin-client-iosx64-1.0.0-metadata.jar"))
            }
        }
        val iosArm64Main by getting {
            dependencies {
                implementation("io.ktor:ktor-client-ios:2.1.3")
                implementation(files("libs/kotlin-client-iosarm64-1.0.0-metadata.jar"))
            }
        }
        val iosSimulatorArm64Main by getting
        val iosMain by creating {
            dependsOn(commonMain)
            iosX64Main.dependsOn(this)
            iosArm64Main.dependsOn(this)
            iosSimulatorArm64Main.dependsOn(this)
        }
        val iosX64Test by getting
        val iosArm64Test by getting
        val iosSimulatorArm64Test by getting
        val iosTest by creating {
            dependsOn(commonTest)
            iosX64Test.dependsOn(this)
            iosArm64Test.dependsOn(this)
            iosSimulatorArm64Test.dependsOn(this)
        }
    }

使用这种配置,它似乎只适用于我的KMM库项目的Android部分。
事实上,在我的KMM库项目中,我可以将KMP项目中的类使用到“androidMain”文件夹中的类中。但是当我尝试将相同的类使用到“commonMain”或“iosMain”文件夹中的类时,它不起作用。
我的项目出了什么问题?我如何打包我的KMP库以便在KMM库中使用它?

kgsdhlau

kgsdhlau1#

你不能在iOS和普通代码中使用你的库的主要原因,因为文件kotlin-client-*-metadata.jar只是元数据。对于多平台和本地代码,Kotlin使用特殊格式的库*.klib。请看article解释这一点。
如果您不想发布库而想使用本地设置,则无需构建库,这不是Gradle的方式。将库放在主代码附近,利用多项目构建,并向库项目添加依赖项:

val commonMain by getting {
     dependencies {
         //...
         implementation(project(":kotlin-client"))
     }
}

// no need to add to another source sets, if your library already supports all targets

或者在本地Maven资源库中发布。

相关问题