Gradle 的核心为真实世界提供了很少的自动化. 所有的实用特性,类似编译java源码的能力, 是由插件提供的. 插件添加了新的任务(如:JavaCompile),域对象(如:SourceSet),公约(如:Java资源位置是src/main/java)以及来自其他插件延伸核心对象和对象。
在本章中,我们将讨论如何使用插件和关于插件的周边概念和术语。

插件的作用是什么

应用插件到项目允许插件来扩展项目的能力。它可以做的事情,如:

  • 扩展摇篮模型(如:添加可配置新的DSL元素)
  • 按照惯例配置项目(如:添加新的任务或配置合理的默认值)
  • 应用特定的配置(如:增加组织库或执行标准)

通过应用插件,而不是向项目构建脚本添加逻辑,我们可以收获很多好处.应用插件:

  • 促进重用和减少维护在多个项目类似的逻辑的开销
  • 允许更高程度的模块化,提高综合性和组织
  • 封装必要的逻辑,并允许构建脚本尽可能是声明性地

    插件的类型

    在Gradle中一般有两种类型的插件,脚本插件和二进制插件.脚本插件是额外的构建脚本,它会进一步配置构建,通常实行声明的方式操纵的构建.尽管他们可以外部化并且从远程位置访问,它们通常还是会在构建内部中使用.二进制插件是实现了Plugin接口的类,并且采用编程的方式来操纵构建.二进制插件可以驻留在构建脚本,项目层级内或外部的插件jar.

    应用插件

    插件需要声明被应用,通过Project.apply()方法完成.应用的插件是idempotent,即相同的插件可以应用多次.如果插件先前以被应用,任何后来的应用是安全的,不会有任何影响的.

    脚本插件

    Example 21.1. Applying a script plugin
    build.gradle
    1. apply from: 'other.gradle'
    脚本插件可以从本地文件系统或在远程位置的脚本中应用.文件系统的位置是相对于项目目录,而远程脚本位置的是由一个HTTP URL指定的.多个脚本插件(两种形式之一)可以被应用到给定的构建。

    二进制插件

    Example 21.2. Applying a binary plugin
    build.gradle
    1. apply plugin: 'java'
    插件可以使用插件ID应用.插件的id作为给定的插件的唯一标识符.核心插件注册一个可以用作插件的id的短名称.在上述情况下,我们可以使用简称java的插件以应用JavaPlugin.社区插件,一方面会使用一个完全合格的形式的插件id(如com.github.foo.bar),但还是有一些传统的插件可能仍然使用很短的,不合格的格式.
    不使用一个插件的id,插件也可以通过简单地指定类来应用插件:
    Example 21.3. Applying a binary plugin by type
    build.gradle
    1. apply plugin: JavaPlugin
    在上面的例子中,JavaPlugin是指JavaPlugin,此类不是严格需要导入org.gradle.api.plugins包中的所有自动导入构建脚本(见:附录E,现有的IDE支持,以及如何没有它应付).此外,这是没有必要追加的.class以识别一个类常量在Groovy,因为它是在Java中。

使用构建脚本块应用插件

项目可以通过添加向构建脚本中加入插件的类路径然后在应用插件,添加作为外部JAR文件的二进制插件.外部jar可以使用buildscrip{}块添加到构建脚本类路径就像Section 62.6, “External dependencies for the build script”中描述的一样.
Example 21.4. Applying a plugin with the buildscript block
build.gradle

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:0.4.1"
  7. }
  8. }
  9. apply plugin: "com.jfrog.bintray"

使用插件的插件DSL

插件DSL正在孵化(incubating)中,请注意,在以后的Gradle版本中,DSL和其它配置可能会改变.

新的插件DSL提供了更为简洁,方便的方式来声明插件的依赖关系。它的适用于与新的Gradle Plugin Portal,同时提供了方便的核心和社区插件.该插件脚本块配置PluginDependenciesSpec的实例.
要应用的核心插件,可以使用短名称:
Example 21.5. Applying a core plugin
build.gradle

  1. plugins {
  2. id 'java'
  3. }

要从插件门户应用一个社区插件,必须使用插件的完全限定id:
Example 21.6. Applying a community plugin
build.gradle

  1. plugins {
  2. id "com.jfrog.bintray" version "0.4.1"
  3. }

不必要进行进一步的配置,就是说没有必要配置buildscript的类路径,Gradle会从插件门户找到该插件,并使构建可用.
参见PluginDependenciesSpec查看关于使用插件DSL的更多信息。

插件DSL的限制

想项目中添加插件的新方法不仅仅是一种更为方便的语法.新的DSL语法处理与老方法有很大的不同.新的机制允许Gradle更早更快的确定插件.这允许做更智能的事,如:

  • 优化插件类的加载和重用.
  • 允许不同的插件使用不同版本的依赖关系.
  • 为编辑构建脚本提供关于隐含属性和值的详细信息

这要求插件被指定使Gradle在执行之前剩下的构建脚本前可以很容易并且很快的提取它.还要求插件使用一些静态的定义。
新的插件机制与”传统的”apply()方法有一些关键区别.也有一些限制,其中一些限制是临时的,随着机制的成熟会逐渐没有,还有一些是方法固有的.

约束语法

新插件{}块不支持任意Groovy代码.被限制的原因是为幂等(每次产生相同的结果)和无副作用(为了Gradle随时执行的安全).
形式是:

  1. plugins{
  2. id «plugin id» version «plugin version»
  3. }

«plugin id»«plugin version»必须是常量,字面量,字符串.其他语句都是不允许的;他们的存在会导致编译错误.
插件{}块也必须在构建脚本的顶部声明.它不能被嵌套在另一个结构(例如,if语句或for循环).

只能在构建脚本中使用

插件{}块目前只能在一个项目的构建脚本中使用.他不能在脚本插件,settings.gradle和出书画脚本中使用.
Gradle的未来版本将删除此限制.

不能与subjects{},allprojects{}等结合使用

目前不能使用一次添加一个插件到多个项目中的模式,如使用subprojects{}等方式.目前没有机制可以应用一次插件到多个项目.目前,每个项目都必须在自己的构建脚本中的plugins{}块中声明应用的插件.
Gradle的未来版本将删除此限制.
如果新语法的限制让人望而却步,推荐使用buildscript{} block.

Gradle 插件规范

语言插件

这些插件添加了可以被编译并在JVM中执行的各种语言的支持
Table 22.1. Language plugins

Plugin Id 自动应用 协同工作 描述
java java-base - 为项目添加java编译,测试及绑定能力,作为许多Gradle插件的基础.参见Chapter 7, Java Quickstart
groovy java, groovy-base - 为Groovy项目构建增加支持,参见Chapter 9, Groovy Quickstart
scala java, scala-base - 增加了对Scala项目构建的支持
antlr java - 增加了对使用ANTLR的生成解析器的支持.

孵化中的语言插件

这些插件增加对各种语言的支持:
Table 22.2. Language plugins

Plugin Id 自动应用 协同工作 描述
assembler - - 增加了原生的汇编语言能力的项目。
c - - 添加C源代码编译能力的项目.
cpp - - 增加C ++源代码编译能力的项目.
objective-c - - 添加的Objective-C ++源代码编译能力的项目.
windows-resources - - 增加了对包括Windows资源的本机二进制文件的支持.

集成插件

这些插件提供的各种运行时的技术的集成.
Table 22.3. Integration plugins

Plugin Id 自动应用 协同工作 描述
application java, distribution - 增加了对运行绑定Java项目作为命令行应用的任务.
ear - java 增加了对构建J2EE应用程序的支持.
jetty war - 在构建中嵌入Jetty web容器可以部署web应用.参见Chapter 10, Web Application Quickstart
maven - java, war 增加了对发布artifacts到Maven仓库的支持.
sogi java-base java 增加了对构建OSGi支持
war java - 增加了对组装Web应用程序WAR文件的支持.参见Chapter 10, Web Application Quickstart

孵化中的集成插件

这些插件提供的各种运行时的技术的集成.
Table 22.4. Incubating integration plugins

Plugin Id 自动应用 协同工作 描述
distribution - - 对构建增加对ZIP和TAR的支持
java-library-distribution java, distribution - 增加了对建筑ZIP和TAR的一个Java库的支持.
ivy-publish - java, war 这个插件提供了一个新的DSL支持发布artifacts ivy存储库,它改善了现有的DSL.
maven-publish - java, war 这个插件提供了一个新的DSL支持发布artifacts Maven仓库,它改善了现有的DSL。

软件开发插件

这些插件在您的软件开发过程中提供帮助.
Table 22.5. Software development plugins

Plugin Id 自动应用 协同工作 描述
announce - - 消息发布到自己喜欢的平台,如Twitter或Growl.
build-announcements announce - 发送本地通知关于有趣的事件在构建生命周期到你的桌面.
checkstyle java-base - 使用Checksytle对项目的Java源码执行质量检测,并生成报告.
codenarc groovy-base - 使用CodeNarc对项目的Groovy的源文件进行质量检测,并生成检测报告
eclipse - java,groovy, scala 生成Eclipse IDE的文件,从而能够以导入项目到Eclipse.参见Chapter 7, Java Quickstart
eclipse-wtp - ear, war 与eclipse插件一样,生成eclipse WPT(Web Tools Platform)配置文件, 导入到Eclipse中war/ear项目应配置与WTP工作.参见参见Chapter 7, Java Quickstart
findbugs java-base - 使用FindBugs执行项目的Java源文件质量检测,并生成检测报告
idea - java 生成Intellij IDEA IDE配置文件,从而可以将项目导入IDEA。
jdepend java-base - 使用JDepend执行项目的源文件质量检测,并生成检测报告
pmd java-base - 使用PMD执行项目的源文件质量检测,并生成检测报告
project-report reporting-base - 生成一个包含关于您的Gradle构建有用信息的报告。
signing base - 添加数字签名档案和artifacts的能力。
sonar - java-base, java, jacoco Sonar代码质量平台整合.由sonar-runner插件提供

孵化中的软件开发插件

这些插件在您的软件开发过程中提供帮助.
Table 22.6. Software development plugins

Plugin Id 自动应用 协同工作 描述
build-dashboard reporting-base - 生成构建仪表板报告.
build-init wrapper - 对Gradle初始化一个新构建提供支持.将一个Maven构建转换为Gradle构建
cnuit - - 提供运行CUnit测试支持
jacoco reporting-base java 对面向Java的JaCoCo代码库整合
sonar-runner - java-base, java, jacoco 提供与Sonar代码质量平台的整合.取代sonar插件
visual-studio - - 增加了与Visual Studio集成.
wrapper - - 增加一个Wrapper任务来生成Gradle打包文件.
java-gradle-plugin java - 通过提供标准的插件生成配置和验证,协助Gradle发展.

基础插件

这些插件是形成其他插件的基本构建模块.你可以在你的构建文件中使用它们,在下面李处完整地列表,然而,注意它们还不是Gradle的公用API的一部分.因此,这些插件未记录在用户指南中.你可能会参考他们的API文档,详细了解它们.
Table 22.7. Base plugins

base

添加标准的生命周期任务和配置合理的默认归档任务:

  • 增加ConfigurationName任务.这些任务组装指定配置的工件。
  • 增加了上传ConfigurationName任务,这些任务组装并上传指定配置的工件。
  • 对所有归档任务配置合理的默认值(如继承AbstractArchiveTask的任务).如归档类型的任务:Jar,Tar,Zip.特别的,归档的destinationDir,baseNameversion属性是预先配置的默认值.这是非常有用的,因为它推动了跨项目的一致性;关于档案的命名规则和完成构建后的位置的一致性。

    java-base

  • 增加资源集的概念到项目中.不添加特定的资源.

    groovy-base

  • 增加了Groovy的源集理念到项目中.

    scala-base

  • 添加scala源集合概念到项目中.

    reporting-base

  • 为项目增加了一些涉及到生产报告的公约性质的属性,

    译者注:实在不会使用MarkDown在表格中加入列表,好在只表格只有两列,故本节不能按照官网的User Guide表格给出.而是以列表形式完成

第三方插件

你可以在Gradle Plugins site找到外部插件.