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

我们可以通过多种方式定义Task,所有的Task都存放在Project的TaskContainer中。

(1)调用Project的task()方法创建Task

在使用Gradle时,创建Task最常见的方式便是:

task hello1 << {
println 'hello1'
}

这里的“<<”表示追加的意思,即向hello1中计入执行过程。我们还可以使用doLast来达到同样的效果:

task hello2 {
doLast {
println 'hello2'
}
}

另外,如果需要向Task的最前面加入执行过程,我们可以使用doFirst

task hello3 {
doFirst {
println 'hello3'
}
}

上面的 Gradle 的 DSL 实际上是一种内部的 DSL 。task关键字实际上是一个方法调用,该方法属于Project。Project存在多个重载的 task()方法。在调用 groovy 方法时,我们可以不用将参数放在括号内。

上面三个自定义的Task都位于TaskContainer中,Project中的tasks属性表示该TaskContainer。

我们可以新建一个Task来显示这些信息:

task showTasks {

    println tasks.class

    println tasks.size()

}

在第一章中的 build.gradle 中加入 showTasks,再执行 gradle showTasks ,命令行输出如下:

上面的 DefaultTaskContainer_Decorated 表示 tasks 类型。而5表示自定义的 task,包括 showTasks 本身。

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

TaskContainer 提供了大量重载的 create() 方法用于添加 Task。

task.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 hello8 << {
println description
} hello8 {
description = "this is hello8"
}

实际上对于hello8的description发生在创建该Task后,执行gradle hello8时,依然能够正确的打印出 this is hello8 。这是因为 gradle 在执行 Task 时分为两个阶段:配置阶段、执行阶段。执行 hello8 前,会先扫描整个build.gradle文档,然后设置属性,再执行 hello8。

还可以通过configure()完成Property的设置:

task hello9 << {
println description
} hello9.configure {
description = "this is hello9"
}

实际上,通过闭包的方法配置Task在内部也是通过调用Task的configuration方法完成的,对此将在后面讲。

创建Task的多种方法的更多相关文章

  1. Gradle学习系列之二——创建Task的多种方法

    在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...

  2. ReadyAPI创建功能测试的多种方法

    原文:ReadyAPI创建功能测试的多种方法 声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能 ...

  3. cocos2dx创建sprite的多种方法

    方法一 最常用,也是最简单的一种方法 CCSprite *bg=CCSprite::create(,,,)); bg->setAnchorPoint(ccp(,)); bg->setPos ...

  4. Pytorch创建模型的多种方法

    目录 Method 1 Method 2 Method 3 Method 4 Reference 网络结构: conv --> relu --> pool --> FC -- > ...

  5. python中创建字典的多种方法

    dict={} dict['key']='value dict={'key':"value","key2":"value2"} dict=d ...

  6. Gradle学习之创建Task的方法

    请通过下面方式下载本系列文章的Github演示样例代码: git clone https://github.com/davenkin/gradle-learning.git     Gradle的Pr ...

  7. 转载“启动\关闭Oracle数据库的多种方法”--来自百度#Oracle

    启动\关闭Oracle数据库的多种方法 启动和关闭oracle有很多种方法. 这里只给出3种方法: l         Sql*plus l         OEM控制台 l         Wind ...

  8. Javascript 中创建自定义对象的方法(设计模式)

    Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. var ...

  9. 设置SQLServer数据库中某些表为只读的多种方法

    原文:设置SQLServer数据库中某些表为只读的多种方法 翻译自:http://www.mssqltips.com/sqlservertip/2711/different-ways-to-make- ...

随机推荐

  1. Ubuntu 15.10环境下安装Hive

    1. 安装MySQL sudo tar -xzvf mysql-5.7.13-linux-glibc2.5-x86_64.tar.gz sudo mv mysql-5.7.13-linux-glibc ...

  2. (十三)linux文件系统详解(基于ext2文件系统)【转】

    本文转载自:https://blog.csdn.net/FadeFarAway/article/details/53959639 我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如 ...

  3. mongodb index 的background 及集群的索引建立

    在数据库建立索引时,默认时"foreground" 也就是前台建立索引,但是,当你的数据库数据量很大时,在建立索引的时会读取数据文件,大量的文件读写会阻止其他的操作,此时在建立索引 ...

  4. centos 源码安装php5.5

    系统环境: CentOS 6.5 / 7.0 x86_64 Fedora 20 x86_64下载 PHP 源码包 # wget http://cn2.php.net/distributions/php ...

  5. python模块cgihttpserver启动

    cgi是web服务器运行web应用的一种机制,web服务器通过执行cgi脚本,然后将该程序的标准输出作为http响应的一部分 CGIHTTPServer是python标准模块的web服务器,它可以运行 ...

  6. POI实现数据的导入

    1.POI技术的概述? POI技术:apache POI是可以对微软office文档进行读和写的工具. l HSSF:操作97格式的excel,扩展名:.xls 纯二进制,最大行数65535. l X ...

  7. awk实现替换字符串中指定位置之间的内容

    # 显示第xx行的第yy列的一个字符sed -n 'xx,xxp' file | awk '{print substr($0,yy,1);}' # 修改第xx行的第yy列的一个字符Chr,并保存为新文 ...

  8. 解析远程域名主机的IP地址

    我们知道,计算机在访问远程主机的时候,本质上是通过IP地址来进行访问的,但我们实际在使用的时候,例如我们想访问百度的主页,我们是通过在浏览器的地址栏输入百度的域名来进行访问的,因此,计算机需要将百度的 ...

  9. IOS 拨打电话:4006 701 855 苹果中国

    IOS 拨打电话:4006 701 855 苹果中国

  10. java 发送http 的get|post 请求

    <div>  package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import jav ...