在编写 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 插件时的 Gradle Api Sources 和 Doc
Gradle:是不是可以在 gradle 插件中定义 CustomTask 并从 build.gradle 中扩展该类?