在编写 Gradle 插件时我是不是应该影响 Kotlin

Posted

技术标签:

【中文标题】在编写 Gradle 插件时我是不是应该影响 Kotlin【英文标题】:Should I shadow Kotlin when writing a Gradle Plugin在编写 Gradle 插件时我是否应该影响 Kotlin 【发布时间】:2019-10-02 17:28:23 【问题描述】:

我正在编写一个插件来从现有的 Gradle 构建脚本中提取一些样板。现有的构建脚本主要是用 Groovy 编写并编译 Java。

为了构建我的插件,我正在使用 Gradle Kotlin DSL,我想我也会借此机会在 Kotlin 中编写插件。这一切都有效,但现在我的插件非常依赖 Kotlin - Gradle 文档特别推荐 minimizing external libraries。

Java 和 Groovy 插件避免了这种情况,因为 Java 和 Groovy 是与 Gradle 共享的依赖项,但 Kotlin 不是共享的先决条件,因此我们必须担心不同插件所需的潜在冲突 Kotlin 版本。

我认为我应该采用以下方法之一,但不清楚哪种方法:

    只需将 Kotlin 的 stdlib 列为标准依赖项并信任 Gradle 即可解决问题。

    这适用于一个插件,但是当另一个插件也在使用但取决于不同的 Kotlin 时,我是否应该预料到问题?

    为我的插件构建某种 uber shadowJar 阴影 Kotlin 库

    暗示我这样写的每个插件都会比必要的大 10 兆。

    放弃基于 Kotlin 的插件并用 Java/Groovy 重写

    放弃新的善会是一种耻辱,但最好避免上述罪恶。

欢迎推荐!

【问题讨论】:

【参考方案1】:

由于您的插件正在替换样板文件并且可能不会公开发布,因此在 Gradle Kotlin DSL 中将其写为 script plugin 是否有意义?这样,一个足够新的 Gradle 应该能够原生地理解它。

【讨论】:

【参考方案2】:

在 Gradle Community Slack 中提出此问题,建议使用 Gradle 的 kotlin-dsl 插件自动配置对 gradleApi()embeddedKotlin() 版本的依赖,因此无论 Kotlin 版本与 Gradle 的 Kotlin DSL 支持捆绑在一起。

我担心这可能会引入对使用 Kotlin DSL 的调用脚本的依赖,但我已经使用 Groovy 脚本进行了测试,并且能够使用我的插件。我认为它仍然依赖于支持 Kotlin DSL 的 Gradle 版本 - 即 4.0+。

【讨论】:

以上是关于在编写 Gradle 插件时我是不是应该影响 Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

Gradle android插件和android测试?

编写 Gradle 插件时的 Gradle Api Sources 和 Doc

Gradle 与 AGP 构建 API: 如何编写插件

Gradle:是不是可以在 gradle 插件中定义 CustomTask 并从 build.gradle 中扩展该类?

Android笔记-自定义Gradle插件

Android笔记-自定义Gradle插件