了解在 Gradle 中应用插件的所有方法
Understanding all the ways to apply a plugin in Gradle
我正在尝试了解您可以在 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(...)
。我如何转换其他两个?
实际上主要只有两种方式,您已经确定了:buildscript 依赖项 + apply
和 plugins
块。您的插件块中的内容实际上只是帮助程序:
id("some.plugin.id") version "version"
是注册插件的基本方式,有ID和版本
kotlin()
实际上只是 Kotlin DSL 提供的辅助函数,它在幕后调用 id()
,并在您传递的任何字符串之前使用 org.jetbrains.kotlin.
前缀。所以在你的情况下它相当于 id("org.jetbrains.kotlin.jvm")
kotlin-dsl
也是一个辅助函数,它是 Kotlin DSL Gradle 插件的快捷方式。我相信字符串 ID 是 org.gradle.kotlin.kotlin-dsl
.
在应用插件的传统方式中,您必须在 buildscript
块中声明对插件的依赖,以便将插件的 类 添加到 [=68 的类路径中=] Gradle 脚本本身。作为第二步,调用 apply
实际上会将插件应用到当前项目。
有了plugins
块,两者同时发生,使用起来更方便。您还可以在插件声明之后添加 apply false
,这样它就被添加到类路径中,而不会将其应用到项目中:
plugins {
id("com.foo.bar.someplugin") version 1.2.3 apply false
}
如果您想在根项目中声明所有插件及其版本,然后使用不带版本的 plugins
块将相关插件应用到子项目中,这将非常有用:
plugins {
id("com.foo.bar.someplugin")
}
Furthermore, I'm confused by why the kotlin-dsl
doesn't even need a version. What is this voodoo magic?
从上面的解释可以看出,任何已经在类路径中的插件都不需要版本。这适用于已在父项目或 settings.gradle(.kts)
的 plugins
中声明的插件,以及内置 Gradle 插件。
Kotlin DSL 插件是一个内置的 Gradle 插件,因此它使用的版本取决于您使用的 Gradle 版本。它类似于 java
或 application
插件。
还明确建议避免为其指定版本in the doc:
Avoid specifying a version for the kotlin-dsl plugin.
Each Gradle release is meant to be used with a specific version of the kotlin-dsl plugin and compatibility between arbitrary Gradle releases and kotlin-dsl plugin versions is not guaranteed. Using an unexpected version of the kotlin-dsl plugin in a build will emit a warning and can cause hard to diagnose problems.
现在关于你的另一个问题:
I would like to standardize the plugins block (let's ignore the apply(...) since it's legacy functionality) so that everything uses id(...). How do I convert the other two?
这里的写法非常地道,所以这应该被认为是“标准”。这实际上是建议在文档中使用的方式。使用 kotlin-dsl
是区分内置 Gradle 插件和第三方插件的好方法。此外,它是声明插件的一种类型安全的方式,它被 IDE 理解并且您可以搜索引用等。字符串在这方面只是劣势。
如果你真的真的想用基于字符串的语法来应用它,你可能会使用 id("org.gradle.kotlin.kotlin-dsl")
,但到目前为止我还没有看到一个项目这样做。
kotlin()
helper 可能更值得商榷,而且是个人品味问题,但在我看来,任意字符串越少越好。
我正在尝试了解您可以在 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(...)
。我如何转换其他两个?
实际上主要只有两种方式,您已经确定了:buildscript 依赖项 + apply
和 plugins
块。您的插件块中的内容实际上只是帮助程序:
id("some.plugin.id") version "version"
是注册插件的基本方式,有ID和版本kotlin()
实际上只是 Kotlin DSL 提供的辅助函数,它在幕后调用id()
,并在您传递的任何字符串之前使用org.jetbrains.kotlin.
前缀。所以在你的情况下它相当于id("org.jetbrains.kotlin.jvm")
kotlin-dsl
也是一个辅助函数,它是 Kotlin DSL Gradle 插件的快捷方式。我相信字符串 ID 是org.gradle.kotlin.kotlin-dsl
.
在应用插件的传统方式中,您必须在 buildscript
块中声明对插件的依赖,以便将插件的 类 添加到 [=68 的类路径中=] Gradle 脚本本身。作为第二步,调用 apply
实际上会将插件应用到当前项目。
有了plugins
块,两者同时发生,使用起来更方便。您还可以在插件声明之后添加 apply false
,这样它就被添加到类路径中,而不会将其应用到项目中:
plugins {
id("com.foo.bar.someplugin") version 1.2.3 apply false
}
如果您想在根项目中声明所有插件及其版本,然后使用不带版本的 plugins
块将相关插件应用到子项目中,这将非常有用:
plugins {
id("com.foo.bar.someplugin")
}
Furthermore, I'm confused by why the
kotlin-dsl
doesn't even need a version. What is this voodoo magic?
从上面的解释可以看出,任何已经在类路径中的插件都不需要版本。这适用于已在父项目或 settings.gradle(.kts)
的 plugins
中声明的插件,以及内置 Gradle 插件。
Kotlin DSL 插件是一个内置的 Gradle 插件,因此它使用的版本取决于您使用的 Gradle 版本。它类似于 java
或 application
插件。
还明确建议避免为其指定版本in the doc:
Avoid specifying a version for the kotlin-dsl plugin. Each Gradle release is meant to be used with a specific version of the kotlin-dsl plugin and compatibility between arbitrary Gradle releases and kotlin-dsl plugin versions is not guaranteed. Using an unexpected version of the kotlin-dsl plugin in a build will emit a warning and can cause hard to diagnose problems.
现在关于你的另一个问题:
I would like to standardize the plugins block (let's ignore the apply(...) since it's legacy functionality) so that everything uses id(...). How do I convert the other two?
这里的写法非常地道,所以这应该被认为是“标准”。这实际上是建议在文档中使用的方式。使用 kotlin-dsl
是区分内置 Gradle 插件和第三方插件的好方法。此外,它是声明插件的一种类型安全的方式,它被 IDE 理解并且您可以搜索引用等。字符串在这方面只是劣势。
如果你真的真的想用基于字符串的语法来应用它,你可能会使用 id("org.gradle.kotlin.kotlin-dsl")
,但到目前为止我还没有看到一个项目这样做。
kotlin()
helper 可能更值得商榷,而且是个人品味问题,但在我看来,任意字符串越少越好。