安装到构建基础
gradle
gradle下载:
https://gradle.org/install
安装:
解压缩,将包拷贝到你想要的安装环境
配置环境:
GRADLE_HOME/bin配置到你的path环境变量中
测试安装
gradle -v
构建基础
Project和tasks是Gradle中最重要的概念
任何一个Gradle构建都是由一个或者多个projects组成,每个project可包括许多可构建组成部分,这完全取决于你要构建些什么。举个栗子,project可以是一个jar或者一个web应用,也可以是由许多项目中产生的jar构成的zip。一个project不必描述它只能进行构建操作。它也可以部署你的应用或搭建你的环境。
Gradle的build-by-convention可以让您具体定义一个project到底应该做什么。
每个project都由多个tasks组成,每个task都代表了构建执行过程中的一个原子性操作。如打包,编译,生成javadoc,发布到某个仓库等操作
可以发现,我们可以在一个project中定义一些简单任务
Hello World
通过运行gradle命令执行构建,gradle命令会从当前目录下寻找build.gradle文件来执行构建。我们成build.gradle文件为构建脚本。严格来说这其实是一个构建配置脚本,后面您会了解到这个构建脚本定义了一个project和一些默认的task
第一个构建脚本:
task hello{
doLast{
print 'Hello World!'
}
}
执行脚本:
在脚本所在目录下运行 gradle -q hello
上面的脚本定义了一个叫hello的task,当执行gradle hello时,Gradle便会去调用hello这个任务来执行给定操作。
快速定义任务
可以用更简洁的方式定义上面的hello任务:
task hello <<{
println 'Hello World!'
}
build.gradle中的注释://
代码即脚本
Gradle脚本采用Groovy书写,最为开胃菜,看下面这个栗子:
task upper <<{
String someString = "mY_nAmE"
println "Original:" + someString
println "Upper case:" +someString.toUpperCase()
}
或者
task count <<{
4.time{
print "$it"
}
}
任务依赖
你可以按照如下方式创建任务之间的依赖关系
在两个任务之间指明依赖关系:
task hello <<{
println 'Hello World!'
}
task intro(dependsOn: hello) <<{
println "I'm Gradle"
}
添加依赖task也可以不必首先声明被依赖的task
延迟依赖
task taskX(dependsOn: 'taskY') <<{
println 'taskX'
}
task taskY <<{
println 'taskY'
}
注意:当引用的任务尚未定义的时候不可使用短标记法
动态任务Dynamic tasks
创建动态任务:
4.times{
counter ->
task "task$counter" <<{
println "I'm task number $counter"
}
}
执行:gradle -q task1 1是在0~3间可变的
任务操纵Manipulating existing tasks
一旦任务被创建后,任务之间可以通过API进行访问。这也是与Ant的不同之处。比如可以增加一些依赖
通过API进行任务之间的通信 - 增加依赖
4.times{
counter ->
task "task$counter" <<{
println "I'm task number $counter"
}
}
task0.dependsOn task2 , task3
执行:gradle -q task0
通过API进行任务之间的通信 - 增加任务行为
task hello <<{
println "Hello Earth"
}
hello.doFirst{
println "Hello Venus"
}
hello.doLast{
println 'Hello Mars'
}
hello <<{
println "Hello Jupiter"
}
doFirst和doLast可以多次调用。它们被分别添加在任务的开头和结尾。当任务开始执行时这些动作会按照既定顺序进行。其中<<操作符号时doLast的简写方式
短标记法Shortcut notations
也许你早就注意到了,没错,每一个任务都是一格脚本的属性,你可以访问它:
以属性的方式访问任务
task hello <<{
println "Hello World!"
}
hello.doLast{
println "Greetings from the $hello.name task."
}
对于插件提供的内置任务,这尤其方便(例如:complie)
添加自定义属性Extra task properties
你可以为一个任务添加额外的属性。例如一个叫做myProperty的属性,用ex.myProperty的方式给他一个初始值,这样便增加了一个自定义属性。
为任务添加自定义属性
task myTask {
ext.myProperty = "myValue"
}
task printTaskProperties <<{
println myTask.myProperty
}
上一个任务不能加<<,不知道为什么
调用Ant任务 using Ant Tasks
Ant任务是Gradle中的一等公民。Gradle借助Groovy对Ant任务进行了优秀的整个。Gradle自带了一个AntBuilder,在Gradle中调用Ant任务比在build.xml中调用更加方便和强大。下面的例子你可以学到如何调用一个Ant任务以及如何与Ant中的属性进行通信
利用AntBuilder执行ant.loadfile
task loadfile <<{
def files = file('antLoadfileResources').listFiles().sort()
files.each{
File file ->
if(file.isFile){
ant.loadfile(srcFile:file , property : file.name)
println "***$file.name***"
println "${ant.properties[file.name]}"
}
}
}
这个我不太会,没执行成功。
方法抽取Using method
Gradle的强大要看你如何编写脚本逻辑.针对上面的例子,首先要做的就是要抽取方法。
利用方法组织逻辑脚本
task checksum <<{
fileList('antLoadfileResources').each{File file ->
ant.checksum(file: file , property : cs_$file.name)
println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
}
}
task loadfile <<{
fileList('antLoadfileResources').each{
File file ->
ant.loadfile(srcFile: file , property: file.name)
println "I'm fond of $file.name"
}
}
File[] fileList(String dir){
file(dir).listFiles({file -> file.isFile()} as FileFilter).sort()
}
定义默认任务 Default tasks
Gradle 允许在脚本中定义多个默认任务
defaultTasks 'clean' , 'fun'
task clean <<{
println 'Default Cleaning!'
}
task fun <<{
println 'Default Running!'
}
task other <<{
println "I'm not a default task!"
}
这样的话直接gradle -q就可以执行了。
这与直接调用gradle clean run效果是一样的。在多项目构建中,每个子项目都可以指定单独的默认任务。如果子项目未进行指定将会调用父项目指定的默认任务
Configure by DAG
稍后会对Gradle的配置阶段和运行阶段进行详细说明,配置阶段后,Gradle会了解所有要执行的任务,Gradle提供了一格钩子来捕获这些信息,一格例子就是可以检查已经执行的任务中有没有被释放,借由此,你可以未一些变量赋予不同的值
下面的例子中,未distribution和release任务赋予了不同的version值
依赖任务的不同输出
task distribution <<{
println "We build the zip with version = $version"
}
task release(dependsOn : 'distribution') <<{
println "we release now"
}
gradle.taskGraph.whenReady{taskGraph ->
if(taskGraph.hasTask(release)){
version = '1.0'
}else{
version = '1.0-SNAPSHOT'
}
}

浙公网安备 33010602011771号