了解在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依赖项+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插件。

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

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

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

我想标准化插件块(让我们忽略apply(…(,因为它是遗留功能(,以便所有东西都使用id(…(。我如何转换其他两个?

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

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

kotlin()助手可能更具争议性,这是个人品味的问题,但IMO的任意字符串越少越好。

最新更新