首页 > 代码库 > Gradle学习(一)

Gradle学习(一)

安装
Gradle需要jdk1.5以上的安装环境,Gradle装配了自己的Groovy库,所以无需安装Groovy,配置GRADLE_HOME以及PATH
gradle -v 测试安装成功与否
Project与Task
    每一个Gradle的配置都是由一个或多个Project组成,Project的含义取决于你用Gradle来做什么,一个Project可能代表一个Jar library 或者一个web应用或者一个zip压缩包,一个Project并不一定代表一个即将被构建的项目,
也可能代表一个已经被构建好的项目。
    每一个Project由一个或多个Task组成,一个Task代表一些原子性的构建工作,可能是编译代码,打jar包,生成java文档,或者发布一些归档信息到一个repository。
Hello World
    用命令行运行Gradle构建的时候,会在当前目录下寻找一个名为build.gradle的文件
    在这个build script里定义了一个名为hello的task,当你运行gradle hello命令时gradle就会执行hello这个task里面的内容,这样定义的方式与Ant中target十分相似,Gradle中的task可以等价于Ant中的target
 
task hello {
    doLast{
       println "Hello World!"
   }

}

运行gradle -q hello 得到如下结果(-q选型时关闭gradle日志信息,直接使用gradle hello也可以得到相同的结果,但会打印出一些Gradle的日志)

 一种更简洁的hello task定义方式,输出结果与上述方式结果一致
?
1
2
3
task hello << {
      println ‘Hello World‘
}
Task依赖
?
1
2
3
4
5
6
task hello << {
      println ‘Hello World‘
}
task intro(dependsOn: hello) << {
      println "I‘m Gradle"
}

 依赖与被依赖task的定义顺序可以颠倒
 
?
1
2
3
4
5
6
task taskX(dependsOn: ‘taskY‘) << {
     println "taskX"
}
task taskY << {
     println "taskY"
}

动态Task

?
1
2
3
4
5
6
4.times {
  counter -> 
  task "task$counter" <<{
     println "I‘m task number $counter"
  }
}

操作已经存在的Task
一旦一个task被创建了那么他们就可以被API访问,这一点与Ant不同
?
1
2
3
4
5
6
7
4.times {
  counter ->
  task "task$counter" <<{
     println "I‘m task number $counter"
  }
}
task0.dependsOn task2, task3

?
1
2
3
4
5
6
7
8
9
10
11
12
task hello << {
      println ‘Hello Earth‘
}
hello.doFirst {
    println "Hello Venus"
}
hello.doLast {
    println "Hello Mars"
}
hello << {
    println "Hello Jupiter"
}

doFirst和doLast可以被定义并执行多次(定义同样的操作类型则按照定义的顺序执行) hello << 等价于hello.doLast

额外的Task配置

你可以通过ext.设置task的额外属性
?
1
2
3
4
5
6
task myTask {
    ext.myProperty = "myValue"
}
task printTaskProperties <<{
    println myTask.myProperty
}

定义默认任务

?
1
2
3
4
5
6
7
defaultTasks ‘clean‘, ‘run‘
task clean << {
   println "Default Cleaning!"
}
task run << {
   println "Default Running!"
}

相当于执行gradle clean run 命令
在多工程构建中每一个子项目都可以拥有其默认的任务,如果一个子项目没有指定其默认的任务,那么就会执行其父项目的默认任务(如果父项目中定义的话)
 
gradle有配置阶段以及执行阶段,在配置阶段之后Gradle会知道将要被执行的所有任务,Gradle给你提供一个“钩子”来让你使用这些信息
下面这个例子阐述了release task是不是被执行的task之一,根据结果你可以分配不同的值给不同的变量
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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"
   }
}

当release task被执行的时候version = "1.0" 没被执行的时候   version = "1.0-SNAPSHOT"