我想弄清楚为什么我的Kotlin MPP库的依赖项目在他们的common
模块中看不到任何提供的模块,即使目标(jvm, android)可以看到它们。
通过maven-publish发布。
库的/build
目录不包含任何我可以识别为我的公共模块的中间表示的内容,这使我认为我需要显式地告诉Gradle生成要包含在发布包中的common
文件。
实际上,在android
和desktop
(jvm)模块中生成的.aar
和.jar
文件看起来都很正常,但是发布的公共模块是空的。
我需要这个公共模块被填充,然后我才能在依赖项目的公共模块中对它进行编码。
这是我的build.gradle.kts的相关部分。我省略了存储库配置,因为它似乎可以工作。
我基本上是按照kotlinlang.org上的说明做的。
我已经查看了maven-publish
插件的配置,kotlin-multiplatformm
插件的设置,以及配置的项目结构。
kotlin版本为1.6.10,由于Jetbrains Compose依赖而无法更新。
plugins {
kotlin("multiplatform")
id("com.android.library")
id("maven-publish")
}
kotlin {
android {
publishLibraryVariants = listOf("release", "debug")
}
jvm("desktop") {
compilations.all {
kotlinOptions {
jvmTarget = "11"
}
}
}
val publicationsFromMainHost = listOf(jvm("desktop").name, "kotlinMultiplatform")
publishing {
publications {
matching { it.name in publicationsFromMainHost }.all {
val targetPublication = this@all
tasks.withType<AbstractPublishToMaven>()
.matching { it.publication == targetPublication }
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.2")
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
}
}
val androidMain by getting {
dependencies {
implementation("androidx.startup:startup-runtime:1.1.1")
}
}
val androidTest by getting {
dependencies {
implementation("junit:junit:4.13.2")
implementation("androidx.test:core:1.4.0")
implementation("androidx.test:runner:1.4.0")
implementation("androidx.test:rules:1.4.0")
implementation("org.robolectric:robolectric:4.6.1")
}
}
val desktopMain by getting
val desktopTest by getting {
dependencies {
implementation("junit:junit:4.13.2")
}
}
}
}
答案是手动提供Kotlin stdlib依赖项,而不是依赖gradle插件来添加它。
当只存在基于jvm的构建时,commonMain
将使用平台类型jdk8
而不是common
来构建。通过显式地依赖stdlib-common
,它将被强制返回到common
平台,然后正确的元数据将被创建和发布。
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation(kotlin("stdlib-common"))
}
}
}
}