Gradle 的核心为真实世界提供了很少的自动化. 所有的实用特性,类似编译java源码的能力, 是由插件提供的. 插件添加了新的任务(如:JavaCompile),域对象(如:SourceSet),公约(如:Java资源位置是src/main/java
)以及来自其他插件延伸核心对象和对象。
在本章中,我们将讨论如何使用插件和关于插件的周边概念和术语。
插件的作用是什么
应用插件到项目允许插件来扩展项目的能力。它可以做的事情,如:
- 扩展摇篮模型(如:添加可配置新的DSL元素)
- 按照惯例配置项目(如:添加新的任务或配置合理的默认值)
- 应用特定的配置(如:增加组织库或执行标准)
通过应用插件,而不是向项目构建脚本添加逻辑,我们可以收获很多好处.应用插件:
- 促进重用和减少维护在多个项目类似的逻辑的开销
- 允许更高程度的模块化,提高综合性和组织
- 封装必要的逻辑,并允许构建脚本尽可能是声明性地
插件的类型
在Gradle中一般有两种类型的插件,脚本插件和二进制插件.脚本插件是额外的构建脚本,它会进一步配置构建,通常实行声明的方式操纵的构建.尽管他们可以外部化并且从远程位置访问,它们通常还是会在构建内部中使用.二进制插件是实现了Plugin接口的类,并且采用编程的方式来操纵构建.二进制插件可以驻留在构建脚本,项目层级内或外部的插件jar.应用插件
插件需要声明被应用,通过Project.apply()方法完成.应用的插件是idempotent,即相同的插件可以应用多次.如果插件先前以被应用,任何后来的应用是安全的,不会有任何影响的.脚本插件
Example 21.1. Applying a script plugin
build.gradle
脚本插件可以从本地文件系统或在远程位置的脚本中应用.文件系统的位置是相对于项目目录,而远程脚本位置的是由一个apply from: 'other.gradle'
HTTP URL
指定的.多个脚本插件(两种形式之一)可以被应用到给定的构建。二进制插件
Example 21.2. Applying a binary plugin
build.gradle
插件可以使用插件ID应用.插件的id作为给定的插件的唯一标识符.核心插件注册一个可以用作插件的id的短名称.在上述情况下,我们可以使用简称apply plugin: 'java'
java
的插件以应用JavaPlugin.社区插件,一方面会使用一个完全合格的形式的插件id(如com.github.foo.bar
),但还是有一些传统的插件可能仍然使用很短的,不合格的格式.
不使用一个插件的id,插件也可以通过简单地指定类来应用插件:
Example 21.3. Applying a binary plugin by type
build.gradle
在上面的例子中,JavaPlugin是指JavaPlugin,此类不是严格需要导入org.gradle.api.plugins包中的所有自动导入构建脚本(见:附录E,现有的IDE支持,以及如何没有它应付).此外,这是没有必要追加的.class以识别一个类常量在Groovy,因为它是在Java中。apply plugin: JavaPlugin
使用构建脚本块应用插件
项目可以通过添加向构建脚本中加入插件的类路径然后在应用插件,添加作为外部JAR文件的二进制插件.外部jar可以使用buildscrip{}
块添加到构建脚本类路径就像Section 62.6, “External dependencies for the build script”中描述的一样.
Example 21.4. Applying a plugin with the buildscript block
build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:0.4.1"
}
}
apply plugin: "com.jfrog.bintray"
使用插件的插件DSL
插件DSL正在孵化(incubating)中,请注意,在以后的Gradle版本中,DSL和其它配置可能会改变.
新的插件DSL提供了更为简洁,方便的方式来声明插件的依赖关系。它的适用于与新的Gradle Plugin Portal,同时提供了方便的核心和社区插件.该插件脚本块配置PluginDependenciesSpec的实例.
要应用的核心插件,可以使用短名称:
Example 21.5. Applying a core plugin
build.gradle
plugins {
id 'java'
}
要从插件门户应用一个社区插件,必须使用插件的完全限定id:
Example 21.6. Applying a community plugin
build.gradle
plugins {
id "com.jfrog.bintray" version "0.4.1"
}
不必要进行进一步的配置,就是说没有必要配置buildscript的类路径,Gradle会从插件门户找到该插件,并使构建可用.
参见PluginDependenciesSpec查看关于使用插件DSL的更多信息。
插件DSL的限制
想项目中添加插件的新方法不仅仅是一种更为方便的语法.新的DSL语法处理与老方法有很大的不同.新的机制允许Gradle更早更快的确定插件.这允许做更智能的事,如:
- 优化插件类的加载和重用.
- 允许不同的插件使用不同版本的依赖关系.
- 为编辑构建脚本提供关于隐含属性和值的详细信息
这要求插件被指定使Gradle在执行之前剩下的构建脚本前可以很容易并且很快的提取它.还要求插件使用一些静态的定义。
新的插件机制与”传统的”apply()
方法有一些关键区别.也有一些限制,其中一些限制是临时的,随着机制的成熟会逐渐没有,还有一些是方法固有的.
约束语法
新插件{}
块不支持任意Groovy代码.被限制的原因是为幂等(每次产生相同的结果)和无副作用(为了Gradle随时执行的安全).
形式是:
plugins{
id «plugin id» version «plugin version»
}
«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
,baseName
和version
属性是预先配置的默认值.这是非常有用的,因为它推动了跨项目的一致性;关于档案的命名规则和完成构建后的位置的一致性。java-base
-
groovy-base
-
scala-base
-
reporting-base
为项目增加了一些涉及到生产报告的公约性质的属性,
译者注:实在不会使用MarkDown在表格中加入列表,好在只表格只有两列,故本节不能按照官网的User Guide表格给出.而是以列表形式完成
第三方插件
你可以在Gradle Plugins site找到外部插件.