原文链接

以这篇博客開始,我将写一系列关于Gradle的文章,用来记录接触Gradle构建脚本以来我所理解的Gradle。

今天要讲的就是Gradle tasks以及task的配置和运行。可能有的读者还不了解Gradle task。用真实的样例来展示应该更容易被理解。

以下的代码展示了三个Gradle task,稍后会解说这三者的不同。

    task myTask {
println "Hello, World!"
} task myTask {
doLast {
println "Hello, World!"
}
} task myTask << {
println "Hello, World!"
}

我的目的是创建一个task。当它运行的时候会打印出来”Hello, World!”。

当我第一次创建task的时候,我推測应该是这样来写的:

    task myTask {
println "Hello, World!"
}

如今,试着来运行这个myTask,在命令行输入gradle myTask,打印例如以下:

    user$ gradle myTask
Hello, World!
:myTask UP-TO-DATE

这个task看起来起作用了。

它打印了”Hello, World!”。

可是,它事实上并没有像我们期望的那样。以下我们来看看为什么。在命令行输入gradle tasks来查看全部可用的tasks。

    user$ gradle tasks
Hello, World!
:tasks ------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------ Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
..........

等等,为什么”Hello, World!”打印出来了?我不过想看看有哪些可用的task,并没有运行不论什么自己定义的task!

原因事实上非常easy。Gradle task在它的生命周期中有两个基本的阶段:配置阶段 和 运行阶段。

可能我的用词不是非常精确,但这的确能帮助我理解tasks。

Gradle在运行task之前都要对task先进行配置。那么问题就来了,我怎么知道我的task中,哪些代码是在配置过程中运行的,哪些代码是在task运行的时候运行的?答案就是,在task的最顶层的代码就是配置代码,比方:

    task myTask {
def name = "Pavel" //<-- 这行代码会在配置阶段运行
println "Hello, World!"////<-- 这行代码也将在配置阶段运行
}

这就是为什么我运行gradle tasks的时候,会打印出来”Hello, World!”-由于配置代码被运行了。但这并非我想要的效果,我想要”Hello, World!”只在我显式的调用myTask的时候才打印出来。

为了达到这个效果,最简单的方法就是就是使用Task#doLast()方法。

    task myTask {
def text = 'Hello, World!' //configure my task
doLast {
println text //this is executed when my task is called
}
}

如今,”Hello, World!”只会在我运行gradle myTask的时候打印出来。Cool。如今我已经知道怎样配置以及使task做正确的事情。另一个问题,最開始的样例中。第三个task的<<符号是什么意思?

    task myTask2 << {
println "Hello, World!"
}

这事实上不过doLast的一个语法糖版本号。

它和以下的写法效果是一样的:

    task myTask {
doLast {
println 'Hello, World!' //this is executed when my task is called
}
}

可是,这样的写法全部的代码都在运行部分。没有配置部分的代码,因此比較适合那些简小不须要配置的task。一旦你的task须要配置,那么还是要使用doLast的版本号。

Happy Gradling

Gradle Tips#1-tasks的更多相关文章

  1. org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6709758.html Android Studio导入项目报错: org.gradle.api.inter ...

  2. Android studio Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to

    http://blog.csdn.net/FlyRabbit_1/article/details/74536317 Error:org.gradle.api.internal.tasks.Defaul ...

  3. [Android Pro] Gradle Tips#2-语法

    referece to : http://blog.csdn.net/lzyzsd/article/details/46935063 在第一篇博客中,我讲解了关于tasks和构建过程中task的不同阶 ...

  4. [Android Pro] Gradle Tips#1-tasks

    reference to : http://trickyandroid.com/gradle-tip-1-tasks/ http://blog.csdn.net/lzyzsd/article/deta ...

  5. Gradle tip #3: Tasks ordering

    I noticed that the quite often problem I face when I work with Gradle - is tasks ordering (either ex ...

  6. Gradle tip #1: tasks

    With this post I would like to start series of Gradle-related topics I wish I knew when I first star ...

  7. Gradle Goodness: Excluding Tasks for Execution

    In Gradle we can create dependencies between tasks. But we can also exclude certain tasks from those ...

  8. Gradle Goodness: Adding Tasks to a Predefined Group

    In Gradle we can group related tasks using the group property of a task. We provide the name of our ...

  9. Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to...异常处理

    这个是打开Android Studio项目报的错误提示,单纯从上面的提示还是不能太直接的知道什么问题.后来我想这个项目的Gradle版本与我当前AS使用的版本不一致,可能是这个问题. 修改build. ...

随机推荐

  1. 【Cocos2d-X开发学习笔记】第19期:动作管理类(CCActionManager)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一.动作管理类 动作管理类CCActionMan ...

  2. Window7下vagrant的部署

    1. 下载并安装VirtualBox     下载地址:https://www.virtualbox.org/wiki/Downloads,下载最新的安装包,接下来的安装步骤就是下一步下一步了,你懂的 ...

  3. 分享几个社交类网站常用并且也是最好用的jquery类库

    官网都有详细的文档说明,大家自行百度谷歌哈! artZoom:常用于微博,支持图片放大缩小旋转 AutoComplete:自动完成 BackTop:当内容多时出现“返回顶部” CFUpload:批量上 ...

  4. Centos7安装Oracle JDK

    查看Linux是否自带的JDK,如有openJDK,则卸载 java -version

  5. openssl 摘要和签名验证指令dgst使用详解

    1.信息摘要和数字签名概述 信息摘要:对数据进行处理,得到一段固定长度的结果,其特点输入: 1.输出长度固定.即输出长度和输入长度无关. 2.不可逆.即由输出数据理论上不能推导出输入数据 4.对输入数 ...

  6. python - 面向对象(一)

    python是一门面向对象的编程语言,python中的一切均是对象. 有对象就提到类,对象和类就像是儿子和老子的关系,是不可分的一对. 什么是类     类就是具有一些共同特性的事物的统称.好比人类, ...

  7. asp net 编程问题 实现下一篇 和上一篇效果

    首先是access数据库,有一个名为news的表,里面有三个字段,分别为id,classid 和name 其中id为主键,classid可以重复 现在有以下数据: id classid name 1 ...

  8. Windows命令行(DOS命令)教程-7 (转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_6.html

    11. deltree [功能] 删除目录树 [格式] [C:][path]DELTREE [C1:][path1] [[C2:][path2] […]] [说明] 这个命令将整个指定目录树全部消灭, ...

  9. .net 开发定时执行的windows服务

    环境:win7+vs2010+Oracle11g+office2010(64位操作系统) 需求:开发定时执行的windows服务从数据库中查询数据下载到指定地址Excel中 一.添加新建项目——win ...

  10. css 文本域textarea显示成label标签

    <html> <head>     <title>textarea显示为label</title> <style type="text/ ...