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

zazmityj  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图了解您可以在Gradle中应用插件的所有方式,KotlinDSL。This问题回答了我的部分问题,但不是全部(我猜方法已经在六年前添加了)。
我在我的一个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(...)

exdqitrt

exdqitrt1#

实际上,只有两种方法,您已经确定:buildscript依赖项+apply,以及plugins块。这里插件块中的内容实际上只是helper:

  • id("some.plugin.id") version "version"是用ID和版本注册插件的基本方法
  • kotlin()实际上只是Kotlin提供的一个helper函数,它在后台调用id(),并在所传递的任何字符串之前添加一个org.jetbrains.kotlin.前缀。
  • kotlin-dsl也是KotlinDSL 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插件。
KotlinDSL插件是一个内置的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的字符串越少越好。

相关问题