从 Gradle 5.1.1 升级到 6.0.1 会中断 Kotlin 多平台构建

Upgrading from Gradle 5.1.1 to 6.0.1 breaks Kotlin multiplatform build

我已经升级我的 Kotlin 多平台项目以使用 Gradle 6.0.1:

gradle wrapper --gradle-version 6.0.1 --distribution-type all

现在我的构建坏了。它无法识别我添加为项目依赖项的通用模块:

dependencies {
    commonMainApi("mygroup:mylib:$myversion")
}

我正在使用 Kotlin DSL,这个项目也是一个多平台项目。我得到的是一堵文本墙,详细说明了所有无法解析的导入(所有这些都应该是从我依赖的 common 模块导入到我项目中的 common 模块)。

我唯一做的就是升级到 Gradle 6.0.1。如果我恢复以前的状态,我的构建就可以了。我做错了什么?

这很可能与 Gradle 6.0+ 不会急切地从存储库请求 *.module 元数据文件这一事实有关,除非模块的 *.pom 包含一个特殊的标记,在 *.pom 发布的较旧 Gradle 版本(我相信是 5.3 之前)

中不存在

需要这些 *.module 元数据文件才能将单个依赖项正确解释为用于分析项目公共源的公共代码元数据和构建目标所针对的特定于平台的工件。否则,依赖项将解析为根本没有工件的库的根模块。

要在消费者端修复此问题,您可以通过将此语句添加到构建脚本中的存储库声明来使 Gradle 请求那些 *.module 元数据文件:

repositories {
    jcenter { 
        metadataSources { 
            gradleMetadata()
            mavenPom() 
        }
    }
    // or, if you are using a custom Maven repository:
    maven("https://my.repo.com") { 
        metadataSources { 
            gradleMetadata()
            mavenPom() 
        } 
    }
}

在 Gradle 文档中:Supported metadata sources


UPD: JitPack 似乎从 POM 中删除了 Gradle 模块元数据标记(<!-- do_not_remove: published-with-gradle-metadata -->),这导致 Gradle 没有请求 *.module 个元数据文件。也可以使用与上述类似的解决方法。