Kotlin v2.0.21 Help

发布跨平台库

你可以使用 maven-publish Gradle 插件 将一个跨平台库发布到本地 Maven 仓库。在 shared/build.gradle.kts 文件中,指定库的 group、version,以及要发布到的 repositories(仓库)。 该插件会自动创建发布内容。

plugins { //... id("maven-publish") } group = "com.example" version = "1.0" publishing { repositories { maven { //... } } }

发布结构

在使用 maven-publish 时,Kotlin 插件会为每个可以在当前主机上构建的目标自动创建发布内容,但 Android 目标除外, 因为它需要额外的步骤来配置发布

跨平台库的发布内容中包含一个额外的 根(root) 发布 kotlinMultiplatform, 代表整个库,并在被添加为公共源代码集的依赖项时自动解析为适当的特定平台构件。 了解更多关于添加依赖项

这个 kotlinMultiplatform 发布包括元数据构件,并将其他发布作为其变体引用。

kotlinMultiplatform 发布可能还需要源代码和文档构件,如果仓库有这样的要求。 在这种情况下,可以在发布范围内使用 artifact(...) 添加这些构件。

主机要求

除了 Apple 平台目标外,Kotlin/Native 支持交叉编译,允许任何主机生成所需的构件。

为了避免发布过程中的任何问题:

  • 当你的项目目标是 Apple 操作系统时,仅从 Apple 主机进行发布。

  • 仅从一个主机发布所有构件,以避免在仓库中出现重复发布。

    例如,Maven Central 明确禁止重复发布,并会导致发布过程失败。

如果你使用 Kotlin 1.7.0 或更早版本

在 1.7.20 之前,Kotlin/Native 编译器不支持所有交叉编译选项。 如果你使用更早的版本,你可能需要从多个主机发布跨平台项目: 例如,从 Windows 主机编译 Windows 目标,从 Linux 主机编译 Linux 目标,依此类推。 这可能会导致模块的重复发布。避免这种情况的最简单方法是升级到更新版本的 Kotlin,并按照上述方式从单一主机发布。

如果无法升级,为每个目标指定一个主要主机,并在 shared/build.gradle(.kts) 文件中检查它:

kotlin { jvm() js() mingwX64() linuxX64() val publicationsFromMainHost = listOf(jvm(), js()).map { it.name } + "kotlinMultiplatform" publishing { publications { matching { it.name in publicationsFromMainHost }.all { val targetPublication = this@all tasks.withType<AbstractPublishToMaven>() .matching { it.publication == targetPublication } .configureEach { onlyIf { findProperty("isMainHost") == "true" } } } } } }
kotlin { jvm() js() mingwX64() linuxX64() def publicationsFromMainHost = [jvm(), js()].collect { it.name } + "kotlinMultiplatform" publishing { publications { matching { it.name in publicationsFromMainHost }.all { targetPublication -> tasks.withType(AbstractPublishToMaven) .matching { it.publication == targetPublication } .configureEach { onlyIf { findProperty("isMainHost") == "true" } } } } } }

发布一个 Android 库

要发布一个 Android 库,你需要提供额外的配置。

默认情况下,不会发布 Android 库的任何构件。要发布由一组 Android 变体 生成的构件,请在 shared/build.gradle.kts 文件中的 Android 目标块中指定变体名称:

kotlin { androidTarget { publishLibraryVariants("release", "debug") } }

这个示例适用于没有 产品变种 的 Android 库。 对于带有产品变种的库,变体名称还会包含这些风味,比如 fooBarDebugfooBarRelease

默认的发布设置如下:

  • 如果发布的变体具有相同的构建类型(例如,全部为 releasedebug ),它们将与任何消费者构建类型兼容。

  • 如果发布的变体具有不同的构建类型,则只有 release 变体与未包含在发布变体中的消费者构建类型兼容。 所有其他变体(如 debug )将只匹配消费者端的相同构建类型,除非消费者项目指定了 匹配回退

如果希望每个已发布的 Android 变体仅与使用相同构建类型的库消费者兼容, 请设置此 Gradle 属性: kotlin.android.buildTypeAttribute.keep=true

你还可以按产品变种分组发布变体,使得不同构建类型的输出放在一个模块中,并且构建类型成为构件的分类符 (release 构建类型仍然以无分类符发布)。此模式默认情况下是禁用的,可以在 shared/build.gradle.kts 文件中启用,如下所示:

kotlin { androidTarget { publishLibraryVariantsGroupedByFlavor = true } }

禁用源代码发布

默认情况下,Kotlin Multiplatform Gradle 插件会为所有指定的目标发布源代码。 然而,你可以在 shared/build.gradle.kts 文件中使用 withSourcesJar() API 配置并禁用源代码发布:

  • 要禁用所有目标的源代码发布:

    kotlin { withSourcesJar(publish = false) jvm() linuxX64() }
  • 要仅禁用指定目标的源代码发布:

    kotlin { // 仅禁用 JVM 的源代码发布: jvm { withSourcesJar(publish = false) } linuxX64() }
  • 要禁用所有目标的源代码发布,除了指定目标:

    kotlin { // 禁用所有目标的源代码发布,除了 JVM: withSourcesJar(publish = false) jvm { withSourcesJar(publish = true) } linuxX64() }

禁用 JVM 环境属性发布

从 Kotlin 2.0.0 开始,Gradle 属性 org.gradle.jvm.environment 会自动与所有 Kotlin 变体一起发布,以帮助区分 Kotlin Multiplatform 库的 JVM 和 Android 变体。 该属性指示哪个库变体适用于哪个 JVM 环境,Gradle 使用此信息来帮助你的项目进行依赖解析。 目标环境可以是 "android"、"standard-jvm" 或 "no-jvm"。

你可以通过在 gradle.properties 文件中添加以下 Gradle 属性来禁用该属性的发布:

kotlin.publishJvmEnvironmentAttribute=false
Last modified: 26 十一月 2024