从Gradle 5.1.1升级到6.0.1会破坏Kotlin多平台构建。

5

我已将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。如果我恢复到以前的状态,我的构建就没问题。我做错了什么?
1个回答

5
这可能与Gradle 6.0+不会立即从存储库中请求*.module元数据文件有关,除非模块的*.pom包含一个特殊标记,而旧版Gradle版本(我相信是pre-5.3)发布的*.pom中则没有该标记。这些*.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 文档中:支持的元数据来源
更新: JitPack 似乎会从 POM 中删除 Gradle 模块元数据标记 (<!-- do_not_remove: published-with-gradle-metadata -->),这导致 Gradle 不会请求 *.module 元数据文件。可以使用上述描述的类似解决方法。

我正在使用的库今天由我发布,它使用的是Gradle 6.0.1。这会有任何改变吗? - Adam Arold
@AdamArold 我从未遇到过使用Gradle 5.3+发布的库出现这种情况,所以我不知道为什么会发生这种情况。你的库的根模块(名称中没有后缀的那个)是否已发布*.module文件?你是否将该模块的ID指定为依赖项?你是否在Gradle pre-6.0中使用了enableFeaturePreview("GRADLE_METADATA") - hotkey
另外有助于解决问题的是Gradle的依赖关系分析工具:./gradlew dependencyInsight --configuration metadataCompileClasspath --dependency=mylib - hotkey
我所有的模块都在根项目中有*.module文件(请查看此处),并将其ID指定为依赖项。我还拥有功能预览。 - Adam Arold
顺便说一下,如果我将metadataSources块添加到使用多平台依赖项的项目中,则构建可以正常工作,谢谢。 - Adam Arold
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接