任务作为Gradle的核心功能模块,而且Gradle的任务还可以具有自己的属性和方法,大大扩展了Ant任务的功能。由于任务相关内容比较多,分为两篇来探讨,本篇主要涉及到:任务的定义、任务的属性、任务的配置、任务间依赖。

创建demo项目

为了本文演示的顺利运行,创建一个demo,名为gradle-tasks

  1. mkdir gradle-tasks && cd gradle-tasks && gradle init

由于我没有windows环境,windows环境的朋友可仿照上面:创建文件夹->进入文件夹->执行gradle init任务。

任务定义

Gradle的任务定义除了关键词定义,还有几个变种,是为了使用某些场合而设计的,如关键词定义不支持表达式等。实际上创建任务是调用org.gradle.api.tasks.TaskContainer的create方法,TaskContainer中的方法签名如下,因此这玩意最好不要死记硬背,忘记了就查下dsl文档

关键词方式

编辑build.gradle,添加任务

  1. task helloWorld {
  2. doLast {
  3. println "hello world!"
  4. }
  5. }
任务执行

执行任务的语法是

  1. gradle [option...] [task...]

其中有个选项是quiet简写为q,只记录错误信息,用于输出简洁的回显。执行上面关键词的任务

  1. gradle helloWorld

回显

Starting a Gradle Daemon (subsequent builds will be faster)

:hello

hello world!

  1. gradle -q helloWorld

回显

hello world!

如果你的任务名称是驼峰格式,还可以使用简写如执行helloWorld

  1. gradle -q hW
关键词-字符串
  1. task 'str'{
  2. doLast{
  3. println 'this is a str task';
  4. }
  5. }
函数式-关键词
  1. task(testName){
  2. doLast{
  3. println "my names is zhaiqianfeng."
  4. }
  5. }
函数式-字符串
  1. task('testString'){
  2. doLast{
  3. println "This is a string task."
  4. }
  5. }
函数式-map
  1. tasks.create(name:'testMap'){
  2. doLast{
  3. println "This is a map task."
  4. }
  5. }

当然你还可以使用更多参数如type,configuration等,具体值可以参考dsl文档,如

  1. task('copy', type: Copy) {
  2. from(file('srcDir'))
  3. into(buildDir)
  4. }

任务属性

经常会对你定义的任务进行一些配置或定义依赖的操作,这就需要能够访问到它们。每个任务都是作为项目的属性(property)

  1. println helloWorld.name
  2. println project.helloWorld.name

也可以通过任务集合来访问任务

  1. println tasks['helloWorld'].name
  2. println tasks.helloWorld.name

也可以通过getByPath访问任何项目的任务,":"代表根路径

  1. println tasks.getByPath('helloWorld').path
  2. println tasks.getByPath(':helloWorld').path

我们在build script中添加任务来测试

  1. task accessTask{
  2. doLast{
  3. println helloWorld.name
  4. println project.helloWorld.name
  5. println tasks['helloWorld'].name
  6. println tasks.helloWorld.name
  7. println tasks.getByPath('helloWorld').path
  8. println tasks.getByPath(':helloWorld').path
  9. }
  10. }

执行

$ gradle -q aT

helloWorld

helloWorld

helloWorld

helloWorld

:helloWorld

:helloWorld

配置任务

可以先定义一个没有任何行为的任务,后期配置,如

  1. task config
  2. config {
  3. doLast{
  4. println "this is a config task."
  5. }
  6. }

你也可以使用变量的方式来配置

  1. Task cf=task('config')
  2. cf.doLast{
  3. println 'this is added by var.'
  4. }
  5. config.doLast{
  6. println 'this is added by name.'
  7. }

任务依赖

任务之间可以有依赖关系,当执行该任务时,会先执行其依赖的任务。任务之间的依赖通过dependsOn关键词来设定。

  1. task hello{
  2. doLast{
  3. print 'hello '
  4. }
  5. }
  6. task world(dependsOn:hello){
  7. doLast{
  8. println 'world!'
  9. }
  10. }

如果依赖的顺序颠倒则必须使用字符串了,否则会找不到的异常:

  1. task world(dependsOn:'hello'){
  2. doLast{
  3. println 'world!'
  4. }
  5. }
  6. task hello{
  7. doLast{
  8. print 'hello '
  9. }
  10. }

当然也可以用属性的方式添加行为

  1. task world{
  2. doLast{
  3. println 'world!'
  4. }
  5. }
  6. world.dependsOn{'hello'}
  7. task hello{
  8. doLast{
  9. print 'hello '
  10. }
  11. }

未完待续....


更多原创文章可关注我的个人博客:宅前疯 或微信公众账号

Gradle之恋-任务1的更多相关文章

  1. Gradle之恋-任务2

    由于任务作为Gradle的核心功能模块,多花点精力是值得的,本文继上一篇主要涉及到:任务的执行顺序.为任务添加组和描述.跳过任务.扩展任务属性.定义默认任务. 任务顺序 如果构建(build)不能在清 ...

  2. Gradle之恋-命令行详解

    虽然很多童鞋都必须要用IDE,但有些命令是IDE很难表现出来的,还是命令行返璞归真.本文就带你来剖析Gradle的命令行. 本文不包括试验性(incubating)的选项,如--configure-o ...

  3. Gradle配置APK自动签名完整流程

    转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...

  4. gradle学习笔记(1)

    1. 安装     (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site:     (2) 添加环境变量:             1) 变量名:GRADLE_HOM ...

  5. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  6. 解决 Could not find com.android.tools.build:gradle 问题

    今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...

  7. React Native Android gradle下载慢问题解决

    很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...

  8. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

  9. 对Maven、gradle、svn、spring 3.0 fragment、git的想法

    1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web  fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...

随机推荐

  1. --@angularJS--angular与BootStrap3的应用

    angularJS与BootStrap3是最佳搭档. 1.Form.html: <!doctype html><html ng-app="UserInfoModule&qu ...

  2. zoom:1-hasLayout

    在现代浏览器,如果子元素float,则父元素不会自动被撑开 #nofloatbox { border: 1px solid #FF0000; background: #CCC; width:200px ...

  3. iOS 知识点

    1. @dynamic.@synthesize 2. iOS NSTimer 3. iOS 之 Aggregate Target 4. iOS 属性之assign.copy.retain 5. iOS ...

  4. backbone 1.1.2 api

    Backbone.js为复杂WEB应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视 ...

  5. JavaScript 正则表达式入门教程

    正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串 主要分三个部分:基本语法.RegExp对象的方法.JS中支持正则表达式的String对象方法 一.基本语法 在JS中,正则表达式为对象,用如 ...

  6. rf对时间控件的操作

    1.如何去掉readonly属性 前端对于时间控件的设置,有时是为了限制用户不能进行手动输入方式进行选择时间,避免在手动输入的时候超限或者输入格式不正确,导致一些不必要的验证麻烦,这是前端开发工程师就 ...

  7. 使用SpringMvc调用POI jar导出excel的源码

    @RequestMapping(value = "/result/export") public String export(ResultIn in,HttpServletRequ ...

  8. [CSS3] 学习笔记-CSS选择器

    CSS3中,选择器的分类很多,有元素选择器.类选择器.ID选择器.属性选择器.后代选择器.子元素选择器.相邻兄弟选择器. 1.最常见的选择器就是元素选择器,文档的元素就是最基本的选择器,例如,h1{} ...

  9. 如何增强ArcGIS插值图出图效果

    如何增强ArcGIS插值图出图效果 by 李远祥 在一些科研领域,经常会遇到使用插值的方式进行处理,并生成最终的插值图.插值图在ArcGIS里面非常容易生成,只要具备了采用点数据,通过ArcToolB ...

  10. ArcGIS制图表达Representation-制图表达介绍

    ArcGIS制图表达技术-制图表达介绍 by 李远祥 在基于GIS数据的制图中,大部分都是使用的数据+符号应用的这种模式.这种模式已经被应用很多年,而且也是非常成熟.对应在ArcGIS体系里面,就是数 ...