了解在 Gradle 中应用插件的所有方法

问题描述 投票:0回答:1

我试图了解在 Gradle、Kotlin DSL 中应用插件的所有方法。 这个问题回答了我的部分问题,但不是全部(我猜方法已经在过去的六年里添加了)。

我在我的一个

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个回答
19
投票

实际上主要只有两种方法,您已经确定了:构建脚本依赖项 +

apply
,或
plugins
块。这里的插件块中的内容实际上只是助手:

  • 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 版本。它类似于

java
application
插件。

还明确建议避免在文档中指定版本

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

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

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

它们在这里的写法非常地道,所以这应该被认为是“标准”。这实际上是建议在文档中使用的方式。使用

kotlin-dsl

 是区分内置 Gradle 插件和第三方插件的好方法。此外,它是声明插件的类型安全方式,IDE 可以理解它,您可以搜索引用等。字符串在这方面稍逊一筹。

如果您真的想使用基于字符串的语法应用它,您可能可以使用

id("org.gradle.kotlin.kotlin-dsl")

,但到目前为止我从未见过项目这样做。

kotlin()

助手可能更具争议性,并且是个人品味的问题,但在我看来,任意字符串越少越好。

© www.soinside.com 2019 - 2024. All rights reserved.