需要准备
- 一个熟悉的 IDE 开发工具
- JDK 7及以上
- Gradle 3.2以上
前期回顾
通过上一节,我们学会如何创建一个简单的任务了,并且知道了如何对任务添加行为,同时为任务设置依赖关系等。而 Gradle 的任务不仅仅只是这么简单,它相较对于 ant 的任务非常强大,它有自己的属性和方法,本章节中我们将进一步深入了解 Gradle 任务的高级使用。
任务常见的几种定义方式
几种常见的任务定义方式,我直接上代码,在代码中写明了注释,大家一看就懂的,就不一一展开介绍了,我们写代码时可以根据自己的爱好灵活选择使用哪种方式就好,其代码如下:
// 第一种,前面见过的
task hello {
doLast {
println "Hello World!"
}
}
// 第二种,以字符串形式定义的
task('hello') {
doLast {
println "hello"
}
}
// 第三种,以字符串形式定义的,
// 其类型为Copy任务类型,接下来会具体讲解
task('copy', type: Copy) {
from(file('srcDir'))
into(buildDir)
}
// 第四种,使用create创建
tasks.create(name: 'hello') {
doLast {
println "hello"
}
}
// 第四种,使用create创建
tasks.create(name: 'copy', type: Copy) {
from(file('srcDir'))
into(buildDir)
}
对任务进行配置
针对前面见到的 Copy 任务,我将详细的分析介绍下任务是如何进行配置,当然其它的任务类型和 Copy 类型配置大同小异,了解了 Copy 类型的配置后自己就可以举一反三的实现其它的任务了。
首先我们定义一个 myCopy 的任务,并且使用闭包的方式来配置该任务,代码如下:
task myCopy(type: Copy) {
from 'resources'
into 'target'
include('**/*.txt', '**/*.xml', '**/*.properties')
}
该任务实现了把resources
目录下的所有 .txt、.xml 和 .properties 文件全部拷贝到target
目录下。其中 from 为源目录,而 into 为目标目录,include 则为只拷贝指定的文件格式。如果没有接触过 groovy 的同学们会对闭包不适应,我们可以使用另一种 java 风格的配置方式,其代码如下:
Copy myCopy = task(myCopy, type: Copy)
myCopy.from 'resources'
myCopy.into 'target'
myCopy.include('**/*.txt', '**/*.xml', '**/*.properties')
这种方式是不是很熟悉,不过我还是推荐上面第一种方式,不管是代码优美还是可读性都好很多。
到这里我们了解了如何配置任务,可能有同学会问,我怎么知道 Copy 类型中有 from、into 等方法属性呢?
这是一个非常好的问题,在 java 里对于我们不懂的类型我们可以查看 API 文档,那么 Gradle 也有类似的 API 文档吗?答案是肯定的。Copy 任务类的 API 文档地址为:官网地址,其相关属性如下:
enter image description here其方法很多,我只截取了一部分,完整的请到官网查看,部分方法如下:
enter image description hereGradle 中很多其它常用的任务,比如Jar
、Delete
、War
、Zip
、Tar
和Upload
等等,这些的用法和 Copy 配置一样,大家可以自己编写任务测试下,如果有问题可以随时给我留言。
任务的重写
我们可以通过指定overwrite
属性为 true 来现实对任务类的覆盖重写,如下所示:
task copy(type: Copy)
task copy(overwrite: true) {
doLast {
println('overwrite the copy.')
}
}
这个任务重写了拷贝任务,仅仅打印输出了一行文字,执行结果如下:
> gradle -q copy
overwrite the copy.
跳过任务或禁用某个任务
这个比较简单,当然在实际项目中又是非常实用的一个技巧,比如,我们构建打包时,有时候不需要打全包,只需要打部分工程,这时我们就可以通过条件选择进行跳过某些任务执行。直接看代码吧:
task hello {
doLast {
println 'hello world'
}
}
hello.onlyIf { !project.hasProperty('skipHello') }
其输出结果为:
> gradle hello -PskipHello
:hello SKIPPED
BUILD SUCCESSFUL
Total time: 1 secs
当然,如果要禁用该任务,只需要设置该任务的enabled
属性为 false 即可,如下所示:
hello.enabled = false
小结
Gradle 比起 ant 来说它的任务非常的强大,这里只是简单介绍了它的部分特性。
网友评论