Gradle - 插件


插件只不过是所有有用任务的集合,例如编译任务、设置域对象、设置源文件等都是由插件处理的。将插件应用到项目意味着它允许插件扩展项目的功能。

这些插件可以执行以下操作:

  • 扩展基本的 Gradle 模型(例如添加可配置的新 DSL 元素)。

  • 根据转换配置项目(例如添加新任务或配置合理的默认值)。

  • 应用特定配置(例如添加组织存储库或强制执行标准)。

插件类型

Gradle 中有两种类型的插件,如下所示 -

  • 脚本插件- 脚本插件是一个附加的构建脚本,它提供了一种声明性的方法来操作构建。这通常在构建中使用。

  • 二进制插件- 二进制插件是实现插件接口并采用编程方法来操作构建的类。二进制插件可以驻留在构建脚本、项目层次结构中或外部插件 JAR 中。

应用插件

Project.apply() API 方法用于应用特定插件。您可以多次使用同一个插件。插件有两种类型,一种是脚本插件,另一种是二进制插件。

脚本插件

脚本插件可以从本地文件系统或远程位置的脚本应用。文件系统位置相对于项目目录,而远程脚本位置指定 HTTP URL。

看一下下面的代码片段。它用于将other.gradle插件应用到构建脚本。在build.gradle文件中使用此代码。

apply from: 'other.gradle'

二进制插件

每个插件均由插件 id 标识。一些核心插件使用短名称来应用插件 ID,一些社区插件使用插件 ID 的完全限定名称。有时,它允许指定插件的类。

看一下下面的代码片段。它展示了如何使用 java 插件的类型来应用它。在build.gradle文件中使用以下代码。

apply plugin: JavaPlugin

查看以下使用短名称应用核心插件的代码。在build.gradle文件中使用此代码。

plugins {
   id 'java'
}

查看以下使用短名称应用社区插件的代码。在build.gradle文件中使用此代码。

plugins {
   id "com.jfrog.bintray" version "0.4.1"
}

编写自定义插件

创建自定义插件时,您需要编写插件的实现。Gradle 实例化插件并使用 Plugin.apply() 方法调用插件实例。

以下示例包含一个问候插件,它将向项目添加一个 hello 任务。查看以下代码并在build.gradle build.gradle 文件中使用此代码。

apply plugin: GreetingPlugin

class GreetingPlugin implements Plugin<Project> {
   void apply(Project project) {
      project.task('hello') << {
         println "Hello from the GreetingPlugin"
      }
   }
}

使用以下代码来执行上述脚本。

C:\> gradle -q hello

输出

这会产生以下输出 -

Hello from the GreetingPlugin

从构建中获取输入

大多数插件需要构建脚本的配置支持。Gradle 项目有一个关联的 ExtensionContainer 对象,有助于跟踪传递给插件的所有设置和属性。

让我们向项目添加一个简单的扩展对象。在这里,我们向项目添加了一个问候语扩展对象,它允许您配置问候语。在build.gradle文件中使用此代码。

apply plugin: GreetingPlugin

greeting.message = 'Hi from Gradle'

class GreetingPlugin implements Plugin<Project> {
   void apply(Project project) {
      // Add the 'greeting' extension object
      project.extensions.create("greeting", GreetingPluginExtension)
		
      // Add a task that uses the configuration
      project.task('hello') << {
         println project.greeting.message
      }
   }
}

class GreetingPluginExtension {
   def String message = 'Hello from GreetingPlugin'
}

使用以下代码执行上述脚本 -

C:\> gradle -q hello

输出

当您运行代码时,您将看到以下输出 -

Hi from Gradle

在此示例中,GreetingPlugin 是一个简单的旧 Groovy 对象,具有名为 message 的字段。扩展对象将添加到插件列表中,名称为greeting。然后,该对象可用作与扩展对象同名的项目属性。

Gradle 为每个扩展对象添加了一个配置闭包,因此您可以将设置分组在一起。看看下面的代码。在build.gradle文件中使用此代码。

apply plugin: GreetingPlugin

greeting {
   message = 'Hi'
   greeter = 'Gradle'
}

class GreetingPlugin implements Plugin<Project> {
   void apply(Project project) {
      project.extensions.create("greeting", GreetingPluginExtension)
		
      project.task('hello') << {
         println "${project.greeting.message} from ${project.greeting.greeter}"
      }
   }
}

class GreetingPluginExtension {
   String message
   String greeter
}

使用以下代码来执行上述脚本。

C:\> gradle -q hello

输出

输出如下 -

Hello from Gradle

标准 Gradle 插件

Gradle 发行版中包含不同的插件。

语言插件

这些插件添加了对可以在 JVM 中编译和执行的各种语言的支持。

插件 ID 自动应用 描述
爪哇 java基础 向项目添加 Java 编译、测试和捆绑功能。它是许多其他 Gradle 插件的基础。
时髦的 java,groovy 基础 添加对构建 Groovy 项目的支持。
斯卡拉 java,scala-base 添加了对构建 Scala 项目的支持。
蚂蚁金服 爪哇 添加对使用 Antlr 生成解析器的支持。

孵化语言插件

这些插件添加了对各种语言的支持。

插件 ID 自动应用 描述
汇编器 - 向项目添加本机汇编语言功能。
C - 向项目添加 C 源代码编译功能。
程序文件 - 向项目添加 C++ 源编译功能。
目标-c - 向项目添加 Objective-C 源代码编译功能。
目标cpp - 向项目添加 Objective-C++ 源编译功能。
Windows 资源 - 添加了对在本机二进制文件中包含 Windows 资源的支持。