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.gradlebuild.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-base 为项目添加 Java 编译、测试和捆绑功能。 它是许多其他 Gradle 插件的基础。
groovy java,groovy-base 添加对构建 Groovy 项目的支持。
scala java,scala-base 添加对构建 Scala 项目的支持。
antlr Java 添加对使用 Antlr 生成解析器的支持。

孵化语言插件

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

插件 ID 自动应用 说明
assembler - 为项目添加本地汇编语言功能。
c - 为项目添加 C 源代码编译功能。
cpp - 为项目添加 C++ 源代码编译功能。
objective-c - 为项目添加 Objective-C 源代码编译功能。
objective-cpp - 为项目添加 Objective-C++ 源代码编译功能。
windows-resources - 添加对在本机二进制文件中包含 Windows 资源的支持。