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

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

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

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

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

# 使用 类型 插件是 通过应用 推荐?

1

Kotlin DSL

脚本插件

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

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

[1]

2

Groovy DSL

脚本插件

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

apply from: 'name-of-script'

[1]

3

Kotlin DSL

预编译脚本插件

.gradle.kts 文件

id("kotlin-dsl")

[2]

4

Groovy DSL

预编译脚本插件

.gradle 文件

id("groovy-gradle-plugin")

[3]

5

Kotlin DSL

二进制插件

.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

二进制插件

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

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

[2]

8

Kotlin

二进制插件

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

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

[2]

9

Groovy

二进制插件

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

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

[2]

10

Scala

二进制插件

抽象类,实现了 Plugin<Project> 接口的 apply(Project 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 编写的 约定插件