【问题标题】:Understanding all the ways to apply a plugin in Gradle了解在 Gradle 中应用插件的所有方法
【发布时间】:2022-10-21 20:43:25
【问题描述】:

我试图了解在 Gradle、Kotlin DSL 中应用插件的所有方法。 This question 回答了我的部分问题,但不是全部(我猜在它们之后的六年里已经添加了一些方法)。

我在我的一个build.gradle.kts 文件中看到了这种确切的情况。

plugins{
   `kotlin-dsl`
   kotlin("jvm") version "1.6.10"
   id("com.foo.bar.someplugin") version 1.2.3
}

apply("foo2.bar2.anotherplugin")

哇,这是应用插件的四种不同方式,我根本不了解它们之间的关系。从另一个答案中,我知道apply(...) 是传统方式,最终将被弃用,但其他三个呢?

此外,我对为什么 `kotlin-dsl` 甚至不需要版本感到困惑。这是什么巫术魔法?

最后,为了保持一致性,我想标准化插件块(让我们忽略apply(...),因为它是遗留功能),以便所有内容都使用id(...)。我如何转换另外两个?

【问题讨论】:

    标签: kotlin gradle gradle-plugin gradle-kotlin-dsl


    【解决方案1】:

    实际上,您已经确定了几乎只有 2 种方式:buildscript 依赖项 + applyplugins 块。您的插件块中的内容实际上只是助手:

    • id("some.plugin.id") version "version"是注册插件的基本方式,带有ID和版本
    • kotlin() 实际上只是 Kotlin DSL 提供的一个辅助函数,它在幕后调用 id(),并在您传递的任何字符串之前加上 org.jetbrains.kotlin. 前缀。所以kotlin("jvm") 只是id("org.jetbrains.kotlin.jvm") 的简写
    • kotlin-dsl 也是一个辅助函数,它是 Kotlin DSL Gradle 插件的快捷方式。我相信字符串 ID 是org.gradle.kotlin.kotlin-dsl

    在应用插件的传统方式中,您必须在 buildscript 块中声明对插件的依赖关系,以便将插件的类添加到类路径中以编译/执行 Gradle 脚本本身。第二步,调用apply 实际上会将插件应用到当前项目。

    使用plugins 块,两者同时发生,因此使用起来更方便。您还可以在插件声明之后添加apply false,以便将其添加到类路径中,而无需将其应用到项目中:

    plugins {
        id("com.foo.bar.someplugin") version 1.2.3 apply false
    }
    

    如果您想在根项目中声明所有插件及其版本,然后使用不带版本的 plugins 块在子项目中应用相关插件,这将非常有用:

    plugins {
        id("com.foo.bar.someplugin")
    }
    

    此外,我对为什么 kotlin-dsl 甚至不需要版本感到困惑。这是什么巫术魔法?

    从上面的解释可以看出,任何已经在类路径中的插件都不需要版本。这适用于已在父项目或settings.gradle(.kts)plugins 中声明的插件,以及内置的 Gradle 插件。

    Kotlin DSL 插件是一个内置的 Gradle 插件,因此它使用的版本取决于您使用的 Gradle 版本。它类似于javaapplication 插件。

    还明确建议避免为其指定版本in the doc

    避免为 kotlin-dsl 插件指定版本。 每个 Gradle 版本都旨在与特定版本的 kotlin-dsl 插件一起使用,并且不保证任意 Gradle 版本和 kotlin-dsl 插件版本之间的兼容性。在构建中使用意外版本的 kotlin-dsl 插件会发出警告,并可能导致难以诊断问题。

    现在至于你的另一个问题:

    我想标准化插件块(让我们忽略apply(...),因为它是遗留功能),以便一切都使用id(...)。我如何转换另外两个?

    它们在这里的写法非常地道,所以这应该被认为是“标准”。这实际上是建议在文档中使用的方式。使用 kotlin-dsl 是区分内置 Gradle 插件和第三方插件的好方法。此外,它是一种声明插件的类型安全方式,IDE 可以理解它,您可以搜索引用等。字符串在这方面稍逊一筹。

    如果你真的想用基于字符串的语法来应用它,你可能会使用id("org.gradle.kotlin.kotlin-dsl"),但到目前为止我从未见过一个项目这样做。

    kotlin() 助手可能更具争议性,并且取决于个人喜好,但 IMO 越少任意字符串越好。

    【讨论】:

    • kotlin-dsl 版本被确定为 gradle 版本,而不是 gradle 配置,这让我感到困扰。其他一切都被宣布作为配置的一部分,所以你知道你得到了什么。而kotlin-dsl 可能会通过升级 Gradle 无意中更改版本。你认为这不是问题吗?为什么?
    • 在我的答案中添加对文档的引用显然有点晚了:)我认为这不是问题,因为这个插件旨在影响 Gradle 构建的工作方式,它主要用于buildSrc' s gradle 构建脚本,它编译将由 Gradle 本身使用的代码,因此它与 Gradle 的版本保持一致是有意义的。此外,它对兼容性更好,因为不能保证固定版本生成适用于更高 Gradle 版本的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多