Gradle 的核心为真实世界提供了很少的自动化.所有的实用特性,类似编译java源码的能力, 是由插件提供的. 插件添加了新的任务(如:JavaCompile),域对象(如:SourceSet),公约(如:Java资源位置是src/main/java)以及来自其他插件延伸核心对象和对象。在本章中,我们将讨论如何使用插件和关于插件的周边概念和术语。
Gradle工具API(参见Chapter.65.Embedding Gradle),用于IDEs和其他工具整合Gradle,总是使用Gradle守护进程执行构建.如果你是从IDE内部执行构建,那么你是在使用守护进程,而且不需要在你的环境中允许Gradle守护进程.但是,除非您已明确启用的Gradle守护进程在你的环境的,你在命令行中的构建不会使用摇篮守护进程。
在内部, Gradle 使用 Ant 和 lvy ,都有自己的 log 系统,Gradle 重定向他们的日志输出到 Gradle 日志系统.除了Ant/lvy的TRACE级别的日志, 映射到Gradle的DEBUG级别, 其余的都会有一个1:1的映射从 Ant/lvy 的日志等级到 Gradle 的日志等级.这意味着默认的 Gradle 日志级别将不会显示任何的 Ant /lvy 的输出, 除非它是一个错误或警告.
Log 是构建的主要"UI"工具. 如果日志太过冗长, 那么真正的警告和问题会隐藏其中, 另一方面, 如果你出错了,你又需要搞清楚相关错误信息. Gradle 提供了6个等级的 log, 如[表17.1.Logs Level]()所示.出了那些你可能经常看到的, 还有两个是 Gradle 特定级别的日志,被称为QUIET和LIFECYCLE.后者是默认的, 并用于报告生成进度.表17.1.
Ant 集成是由 AntBuilder 提供的.git
Gradle 出色的集成了 Ant. 你可以在 Gradle 构建时使用单独的 Ant 任务或完整的 Ant 构建. 事实上, 你会发现在 Gradle 构建脚本中使用Ant任务远比直接使用 Ant 的 XML 格式更加容易和强大. 你甚至可以将 Gradle 仅仅作为一个强大的 Ant 脚本工具.Ant 可以分为两层. 第一层是 Ant 语言. 它给 build.xml 文件, 处理目标, 像 macrodefs 的特殊构造等提供语法支持.
一个项目可以有很多 JAR 文件,你可以向项目中添加 WAR , ZIP 和 TAR 文档,使用归档任务可以创建这些文档: Zip , Tar , Jar , War 和Ear. 它门都以同样的机制工作.例 15.19 创建一个 ZIP 文档 build.gradleapply plugin: 'java'task zip(type: Zip) { from 'src/dist' into('libs') { from configurations.
你可以使用复制任务( Copy )去复制文件. 复制任务扩展性很强,能够过滤复制文件的内容, 映射文件名.使用复制任务时需要提供想要复制的源文件和一个目标目录,如果你要指定文件被复制时的转换方式,可以使用 复制规则. 复制规则被 CopySpec 接口抽象,复制任务实现了这个接口. 使用 CopySpec.from() 方法指定源文件.使用 CopySpec.into() 方法指定目标目录.例 15.10.
文件树就是一个按照层次结构分布的文件集合,例如,一个文件树可以代表一个目录树结构或者一个 ZIP 压缩文件的内容.它被抽象为 FileTree 结构,FileTree 继承自 FileCollection,所以你可以像处理文件集合一样处理文件树, Gradle 有些对象实现了FileTree 接口,例如 源集合.使用 Project.
文件集合表示一组文件,Gradle 使用 FileCollection 接口表示文件集合, Gradle API 中的许多项目都实现了这个接口,例如 dependency configurations .获取 FileCollection 实例的一种方法是使用 Project.files() 方法.你可以传递任何数量的对象参数,这个方法能将你传递的对象集合转换为一组文件对象.files() 方法接收任何类型对象参数.
使用 Project.file() 方法能够相对项目目录定位一个文件例 16.1. 定位文件build.gradle// 使用一个相对路径File configFile = file('src/config.xml')// 使用一个绝对路径configFile = file(configFile.absolutePath)// 使用一个项目路径的文件对象 configFile = file(new File('src/config.xml'))`file() 方法接收任何形式的对象参数.
大多数构建工作需要操作文件,Gradle 增加了一些API帮助您处理这些工作。
为了提高响应能力,Gradle 默认缓存了所有编译后的脚本. 包括所有的构建脚本,初始化脚本,还有其他脚本. Gradle 创建了一个 .gradle 目录来存放编译后的脚本,下次您运行构建脚本时,如果这个脚本自从它被编译后就再也没有被改动过,Gradle 会先使用编译后的脚本. 否则 Gradle 会重新编译脚本,然后将新编译后的文件缓存起来.
Gradle 提供了多种的方法让您可以在构建脚本中添加属性. 使用 -D 命令选项,您可以向运行 Gradle 的 JVM 传递一个 system 属性 . Gradle 命令的 -D 选项 和 Java 命令的 -D 选项有些相同的效果.您也可以使用属性文件向您的 Project 对象中添加属性. 您可以在 Gradle 用户目录( 如果您没有在 USER_HOME/.gradle 配置默认设置,则由"GRADLE_USER_HOME"
下面补充的部分原本是第 14 章,最新的 Gradle 文档将其移除,所以将其作为补充放到这一章节。
终止任务是一个正在开发的功能.这里的终止任务并不是指终止一个任务, 而是指一个无论运行结果如何最后都会被执行的任务.例子 15.27. 加入一个任务终止器build.gradletask taskX << { println 'taskX'}task taskY << { println 'taskY'}taskX.finalizedBy taskYgradle -q taskX 的输出>
有时候也想要一个任务的行为是基于已经定义好的取值范围或者特定规则, 下面的例子就提供了一种很直观漂亮的方式:例子 15.25. 任务规则build.gradletasks.addRule("Pattern: ping<ID>") { String taskName -> if (taskName.startsWith("ping")) { task(taskName) <<
Gradle 提供了好几种跳过一个任务的方式.1. 使用判断条件 (predicate)你可以使用 onlyIf() 方法来为一个任务加入判断条件. 就和 Java 里的 if 语句一样, 任务只有在条件判断为真时才会执行. 你通过一个闭包来实现判断条件. 闭包像变量一样传递任务, 如果任务应该被执行则返回真, 反之亦然. 判断条件在任务执行之前进行判断.例子 15.20. 使用判断条件跳过一个任务build.
关注时代Java