前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建Task的多种方法

创建Task的多种方法

作者头像
用户1134788
发布2018-03-16 16:44:13
8010
发布2018-03-16 16:44:13
举报

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方法完成的,对此将在后面讲。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档