脚本、预编译脚本或二进制插件之间的选择取决于您的具体要求和偏好。

脚本插件简单且易于编写,因为它们直接编写在构建脚本中。它们是用 Kotlin DSL 或 Groovy DSL 编写的。它们适合小型、一次性任务或快速实验。然而,随着构建脚本的大小和复杂性的增加,它们可能会变得难以维护。

预编译脚本插件是编译成打包在库中的 Java 类文件的 Kotlin DSL 脚本。与脚本插件相比,它们提供更好的性能和可维护性,并且可以在不同的项目中重用。您还可以使用 Groovy DSL 编写它们,但不建议这样做。

二进制插件是用 Java 或 Kotlin 编写的成熟插件,编译成 JAR 文件并发布到存储库。它们提供最佳的性能、可维护性和可重用性。它们适用于需要在项目、构建和团队之间共享的复杂构建逻辑。您也可以用 Scala 或 Groovy 编写它们,但不建议这样做。

以下是实现 Gradle 插件的所有选项的细分:

# 使用: 类型: 该插件是: 通过应用创建: 受到推崇的?

1

KotlinDSL

脚本插件

作为实现接口方法的.gradle.kts抽象类在文件中。apply(Project project)Plugin<Project>

apply(from = "name-of-script")

[ 1 ]

2

Groovy DSL

脚本插件

作为实现接口方法的.gradle抽象类在文件中。apply(Project project)Plugin<Project>

apply from: 'name-of-script'

[ 1 ]

3

KotlinDSL

预编译脚本插件

一份.gradle.kts文件

id("kotlin-dsl")

是的[ 2 ]

4

Groovy DSL

预编译脚本插件

一份.gradle文件

id("groovy-gradle-plugin")

[ 3 ]

5

KotlinDSL

二进制插件

一份.gradle.kts文件

id("kotlin-dsl")
id("com.gradle.plugin-publish")

是的[ 2 ]

6

Groovy DSL

二进制插件

一份.gradle文件

id("groovy-gradle-plugin")
id("com.gradle.plugin-publish")

没有[ 2 ]

7

Java

二进制插件

apply(Project project)实现接口方法的抽象类Plugin<Project>

id("java-gradle-plugin")
id("com.gradle.plugin-publish")

是的[ 2 ]

8

Kotlin

二进制插件

apply(Project project)实现接口方法的抽象类Plugin<Project>

id("java-gradle-plugin")
id("org.jetbrains.kotlin.jvm")
id("com.gradle.plugin-publish")

是的[ 2 ]

9

Groovy

二进制插件

apply(Project project)实现接口方法的抽象类Plugin<Project>

id("java-gradle-plugin")
id("groovy")
id("com.gradle.plugin-publish")

没有[ 2 ]

10

Scala

二进制插件

apply(Project project)实现接口方法的抽象类Plugin<Project>

id("java-gradle-plugin")
id("scala")
id("com.gradle.plugin-publish")

没有[ 2 ]

如果您怀疑插件代码存在问题,请尝试创建构建扫描来识别瓶颈。 Gradle分析器可以帮助自动生成构建扫描并收集更多底层信息。


1 .脚本插件很难维护、测试,并且不支持定义新的可重用类型。不推荐使用它们。
2 .建议使用JavaKotlin等静态类型语言来实现插件,以减少二进制不兼容的可能性。如果使用 Groovy,请考虑使用@groovy.transform.CompileStatic.
3 .预编译脚本插件最好用作用Kotlin DSL 或 Java 编写的 约定插件。