文章目的
通过本章的阅读,了解Gradle中的任务和工程的关系,以及任务的定义和如何使用,接下来让我们开始编写自己的任务代码进行工程打包操作吧。
需要准备
- 一个熟悉的IDE开发工具
- JDK 7及以上
- Gradle 3.2以上
工程和任务的关系
在Gradle的世界中最重要的两个概念就是:工程(Project)和任务(Task)。
每一个Gradle的项目都会包含一个或多个工程,而每一个工程的职责又取决于我们对这个工程的定义,比如,一个工程可能是公共的JAR库,或者是一个WEB的应用程序,也可能是一个用于发布部署的ZIP包,而这个ZIP包又是通过其它工程编译打包的JAR文件组装成的。Gradle的编译思想跟maven一样, 也是约定优于配置,不过Gradle又比maven灵活,它为工程提供了很多具体的配置项。
每一个工程又由一个或多个任务组成,一个任务代表了一个工作的最小单元,它可以是一次类的编译、打一个JAR包、生成一份Javadoc或者是向仓库中提交一次版本发布。
接下来我们就一步步的了解如何定义和使用任务来实现不同的编译打包功能,我们会先在一个独立的工程中实现一些任务,然后再扩展到多个工程中去。
任务的定义和使用
当我们使用Gradle的命令时,比如gradle build
,Gradle命令会去寻找当前目录下的build.gradle的文件,这个文件是Gradle的脚本文件,它里面定义了工程和工程拥有的所有任务等信息。
我们还是使用IDEA开发工具打开之前的HelloWorld项目工程,把之前build.gradle文件中所有的内容全部删除,开始今天的任务编写。
首先我们定义一个很简单的任务hello
,其代码如下:
task hello {
doLast {
println 'Hello world!'
}
}
然后打开命令行端终,执行命令:gradle -q hello
,这时我们看到控制台成功的打印输出了:Hello world!',如下图:
图一 hello任务的结果
在以上代码中,我们定义了一个hello的任务,然后为它添加了一个动作(action),当执行gradle hello
命令时,该命令会调用hello任务,然后执行它的动作,打印输出了Hello world!,这个动作是一个groovy的闭包函数。
如果大家对ant熟悉的话,可能会觉得Gradle的任务是不是和ant的相似?确定是的,不过Gradle的任务比ant的灵活方便很多,在Gradle中我们可以像写代码一样地实现很多ant很难实现的功能。
对于上面hello任务的定义,我们可以使用一种更简单便捷的方式实现。我们可以使用<<
操作符来代替上面的doLast方法,如下:
task hello << {
println 'Hello world!'
}
任务的依赖关系
我们可以定义一个任务依赖于某个其它的任务,比如一个发布(release)任务必须依赖编译(build)任务,代码如下:
task build {
doLast {
println "i'm build task"
}
}
task release(dependsOn: build) {
doLast {
println "I'm release task"
}
}
然后再执行gradle -q release
,其输出结果如下:
图二 任务的依赖结果
对现有任务的操作
1,对现有的任务添加依赖关系
task build {
doLast {
println "i'm build task"
}
}
task release() {
doLast {
println "I'm release task"
}
}
// 添任务依赖关系
release.dependsOn build
其执行结果图二一样。
2,对现有的任务添加动作行为
task hello {
doLast {
println 'Hello World!'
}
}
// 法方一,在doFirst动作中添加
hello.doFirst {
println 'Hello doFirst'
}
// 法方二 在doLast动作中添加
hello.doLast {
println 'Hello doLast1'
}
// 法方三 在doLast动作中添加
hello {
doLast {
println 'Hello doLast2'
}
}
执行gradle -q hello
其结果如下:
图三 添加动作行为结果
3,访问现有任务的属性值
task hello {
doLast {
println "Hello world! from the $hello.name task."
}
}
执行gradle -q hello
其结果如下:
图四 访问任务的名称
另外我们还可以为任务设置属性,主要通过ext.myProperty来初始化值,如下所示:
task myTask {
ext.myProperty = "myValue"
}
task printTaskProperties {
doLast {
println myTask.myProperty
}
}
其输出结果为:
> gradle -q printTaskProperties
myValue
4,在任务中调用groovy方法
task hello {
doLast {
int a = 1,b = 2;
int result = add(a,b);
println "a add b is = " + result;
}
}
int add(int a,int b) {
a + b;
}
执行gradle -q hello
其结果如下:
图五 任务调用方法结果
总结
使用Gradle编译工程,其实就是在编译不同的任务,然后根据依赖关系组合执行,最后完成整个项目工程的打包发布。从工程和任务的关系,我们也能看到Gradle把“分而治之”思想运用得恰到好处,实现中我们一个项目可能包含若干个工程,这样使用Gradle就能很好的解决自动化地编译发布了。
请喜欢文章的同学关注我,有任何问题都在下方给我留言,我将会一一回复,我会把gradle的入门使用做成一系列的文章不断的发布。
作者:云时代构架杨彪
链接:https://www.jianshu.com/p/a7b947c86650
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。