Gradle学习之创建Task的方法

请通过以下方式下载本系列文章的Github示例代码:
git clone https://github.com/davenkin/gradle-learning.git
 
 
Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元。我们可以通过很多种方式定义Task,所有的Task都存放在Project的TaskContainer中。
 
(1)调用Project的task()方法创建Task
在使用Gradle时,创建Task最常见的方式便是:
 
task hello1 << {   
  println 'hello1'
}
 
这里的“<<”表示追加的意思,即向hello中加入执行过程。我们还可以使用doLast来达到同样的效果:
 
task hello2 {   
  doLast {      
     println 'hello2'
  }
}
 
 
另外,如果需要向Task的最前面加入执行过程,我们可以使用doFirst:
 
task hello3 {   
  doLast {      
     println 'hello3'
  }
}
 
在上面的3个例子中,Gradle的DSL向我们展示了一种非常自然的风格来创建Task,而事实上这些都只是一种内部DSL,也即必须符合groovy的语法要求。上面的task关键字实际上是一个方法调用,该方法属于Project。Project中存在多个重载的task()方法。和Ruby等动态语言一样,在调用groovy方法时,我们不用将参数放在括号里面。
以上我们自定义的3个Task都位于TaskContainer中,Project中的tasks属性即表示该TaskContainer。为此,我们可以新建一个Task来显示这些信息:
 
task showTasks {   
  println tasks.class   
  println tasks.size()
}
 
将以上4个Task放在同一个build.gradle中,再执行gradle showTasks,命令行输出如下:
 
...class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated4...
 
上面的DefaultTaskContainer_Decorated表示tasks类型,而4表示该TaskContainer中包含有4个自定义的Task——包括showTasks本身。
 
 
(2)通过TaskContainer的create()方法创建Task

在上文中我们讲到,通过task()方法创建的Task都被存放在了TaskContainer中,而Project又维护了一个TaskContainer类型的属性tasks,那么我们完全可以直接向TaskContainer里面添加Task。查查TaskContainer的API文档可以发现,TaskContainer向我们提供了大量重载的create()方法用于添加Task。
 
tasks.create(name: 'hello4') << {   
   println 'hello4'
}
 
(3)声明Task之间的依赖关系
Task之间是可以存在依赖关系,比如TaskA依赖TaskB,那么在执行TaskA时,Gradle会先执行TaskB,再执行TaskA。我们可以在定义一个Task的同时声明它的依赖关系:
 
task hello5(dependsOn:hello4) << {    
  println 'hello5'
}
 
当然,我们也可以在定义Task之后再声明依赖:
 
task hello6 << {   
  println 'hello6'
}
hello6.dependsOn hello5
 

(4)配置Task
一个Task除了执行操作之外,还可以包含多个Property,其中有Gradle为每个Task默认定义的Property,比如description,logger等。另外,每一个特定的Task类型还可以含有特定的Property,比如Copy的from和to等。当然,我们还可以动态地向Task中加入额外的Property。在执行一个Task之前,我们通常都需要先设定Property的值,Gradle提供了多种方法设置Task的Property值。

首先,我们可以在定义Task的时候对Property进行配置:
 
task hello7 << {   
  description = "this is hello7"    
  println description
}
 
我们还可以通过闭包的方式来配置一个已有的Task:
 
task hello7 << {   
  description = "this is hello7"    
  println description
}
 
需要注意的是,对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()方法完成的,对此我们将在后续的文章中详细地讲到。
 

时间: 2024-09-16 02:12:27

Gradle学习之创建Task的方法的相关文章

Gradle学习之第二步创建Task

请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元.我们可以通过很多种方式定义Task,所有的Task都存放在Project的TaskContainer中.   (1)调用Project的task()方法创建Task 在使用Gradle时,创

Gradle学习系列之一——Gradle快速入门(转)

  这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构建多个Project 自定义Task类型 自定义Plugin   请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     和Maven一样,Gradle只是提供了构建项目的一

Gradle学习之Eclipse构建Gradle工程

在 eclipse 下利用 gradle 构建系统 本文为转载:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI. 开发工具:Eclipse IDE for SOA Developers 版本,请到

Gradle学习之基本语法入门

请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     Gradle是一种声明式的构建工具.在执行时,Gradle并不会一开始便顺序执行build.gradle文件中的内容,而是分为两个阶段,第一个阶段是配置阶段,然后才是实际的执行阶段.在 配置阶段,Gradle将读取所有build.gradle文件的所有内容来配置Project和Task等,比如设置Project和Task

ps创建海报的方法多种多样?

  创建海报的方法多种多样?今天给大家分享打造炫酷质感海报(超简单),文字特效海报设计思路及技巧,像电影宣传.科普宣传经常运用,有兴趣的可以借鉴学习 分类: PS入门教程

tomcat-新手学习,创建一个网络项目时遇到的的tomca问题,谢谢指导

问题描述 新手学习,创建一个网络项目时遇到的的tomca问题,谢谢指导 新手学习中,当我在用eclipes ee 4.5 时,如果数据库打开的话,tomcat 8.0总是出现已被占用,出现这样的信息:Port 8080 required by Tomcat v8.0 Server at localhost is already in use. The server may already be running in another process, or a system process may

Gradle学习之使用java plugin

请通过以下方式下载本系列文章的Github示例代码:   git clone https://github.com/davenkin/gradle-learning.git     Gradle最常用的Plugin便是java Plugin了.和其他Plugin一样,java Plugin并没有什么特别的地方,只是向Project中引入了多个Task和Property.当然,java Plugin也有比较与众不同的地方,其中之一便是它在项目中引入了构建生命周期的概念,就像Maven一样.但是,和

python实现在无须过多援引的情况下创建字典的方法_python

本文实例讲述了python实现在无须过多援引的情况下创建字典的方法.分享给大家供大家参考.具体实现方法如下: 1.使用itertools模块 import itertools the_key = ['ab','22',33] the_vale = ['aaaa',"dddddddd",'22222222222'] d = dict(itertools.izip(the_key,the_vale)) print d 2.加参数 dict = dict(red = 1,bule = 2,y

JavaScript学习笔记之数组求和方法_javascript技巧

推荐阅读:JavaScript学习笔记之数组的增.删.改.查 通过最近学习,越来越感觉JavaScript的强大与魅力之处,仅数组一个知识点就让我这样的初学者折腾了很久.折腾是折腾,但还是很有效果的,这几天的学习到的一些基本知识,就在自己的业务就用到了.顿感自信心爆棚,我也有一天能学会JavaScript. 别的不多说了,咱们今天一起来玩数组的求和,看看有哪些方法可以实现数组的求和. 数组方法 JavaScript中数组有很多种方法,下图能更好的向你阐述JavaScript有多少种方法,作用是啥