天使漫步IT工作室天使漫步IT工作室

【学习笔记】Gradle系列之入门

一、关于Gradle的Project和Task

Gradle本身的领域对象主要有Project和Task。
Project为Task提供了执行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。
一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令或者调用Ant。另外,一个Task可以读取和设置Project的Property以完成特定的操作。

二、关于build.gradle

默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。

Gradle提供了几个默认的命令:
● gradle task - 查看默认的任务
● gradle project - 查看当前涵盖的工程
● gredle properties - 查看project包含的properties

dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property

三、Task

多种方式定义Task,所有的Task都存放在Project的TaskContainer中。

● << 追加的方式创建一个task (5.0以后会警告)

task hello1 << {
   println 'hello1'
}

● doLast 方式创建一个Task

task hello2 {
   doLast {
      println 'hello2'
   }
}

● doFirst方式创建一个Task

task hello3 {
   doFirst {
      println 'hello3'}
}

● 通过TaskContainer的create()方法创建Task

tasks.create(name: 'hello4') << {
   println 'hello4'
}

由task:

task showTasks {
   println tasks.class
   println tasks.size()
}

在含有:hello1、hello2、hello3、showTasks的文件运行输出结果:

class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4

4个任务,可以证明gradle默认是顺序执行

四、声明Task依赖

Task之间是可以存在依赖关系,比如TaskA依赖TaskB,那么在执行TaskA时,Gradle会先执行TaskB,再执行TaskA。

● 定义Task的时候就声明依赖

task hello5(dependsOn:hello4) << {
    println 'hello5'
}

task hello6 << {
   println 'hello6'
}
hello6.dependsOn hello5

五、配置Task,即给Task定义成员变量

一个Task除了执行操作之外,还可以包含多个Property,其中有Gradle为每个Task默认定义的Property,比如description,logger等。另外,每一个特定的Task类型还可以含有特定的Property,比如Copy的from和to等。

● 定义的时候配置Task

task hello7 << {
   description = "this is hello7" 
   println description
}

● 动态配置-即使用闭包的方式来配置一个已有的Task

task hello8 << {
   println description
}
hello8 {
   description = "this is hello8"
}

注意:对hello8的description设置发生在创建该Task之后,在执行“gradle hello8”时,命令行依然可以打印出正确的“this is hello8”,这是因为Gradle在执行Task时分为两个阶段,首先是配置阶段,然后才是实际执行阶段。所以在执行hello8之前,Gradle会扫描整个build.gradle文档,将hello8的description设置为“this is hello8”,然后执行hello8,此时hello8的description已经包含了设置后的值。

● 调用Task的configure()方法完成Property的设置

task hello9 << {
   println description
}

hello9.configure {
   description = "this is hello9"
}

实际上,通过闭包的方式配置Task在内部也是通过调用Task的configure()方法完成的,对此我们将在后续的文章中详细地讲到。

Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元。

本站原创,欢迎转载,转载敬请标明出处:天使漫步IT工作室 » 【学习笔记】Gradle系列之入门
添加新评论