任务作为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. C# 堆栈和堆 Heap & Stack

    首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 堆栈中存储值类型. 堆栈实际上是向下填充,即由高内存地址指向低内存地址填充. 堆栈的工作方式 ...

  2. ResultSet遍历过程中修改自身数据,不会改变循环的过程

    ResultSet遍历过程中修改自身数据,不会改变循环的过程: import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  3. 第四组UI组件:AdapterView及子类

    AdapterView组件是一组重要的组件,AdapterView本省是一个抽象基类,它派生的子类在用法上十分相似,只是显示界面与一定的区别,因此这次针对它们的共性集中讲解,并突出介绍他们的区别. A ...

  4. spring mvc上传下载文件

    前端jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  5. Kafka 0.8源码分析—ZookeeperConsumerConnector

    1.HighLevelApi High Level Api是多线程的应用程序,以Topic的Partition数量为中心.消费的规则如下: 一个partition只能被同一个ConsumersGrou ...

  6. Java中Redis简单入门

    Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...

  7. 构建自动化前端样式回归测试——BackstopJS篇

    在使用scss和less开发的时候,遇到过一件很有趣的事,因为网站需要支持响应式,就开了一个响应式样式框架,简单的几百行scss代码,居然生成了近100KB的css代码,因此决定重构这个样式库.而重构 ...

  8. bppm与AD域集成

    1. 使用admin登录BMC ProactiveNet Operations Console,点击选项-> 集成编辑 2. 勾选LDAP集成方式,配置相关信息,点击应用 3. 查看配置文件%B ...

  9. 传输控制协议TCP

    TCP主要特点: (1)面向连接 (2)只能是点到点 (3)可靠的传输协议 (4)全双工通信,各自各自的读写缓冲区,应用层吧数据交给发送缓冲区,tcp合适就发送了,接受的时候tcp写入接受缓冲区,应用 ...

  10. php连接 mysql 数据库

    php 连接数据库 一般是用面向对象的方法,需要先创建一个对象,即造一个连接对象,然后再写sql语句,(增改查删),最后执行sql语句 其中在创建连接对象时 我们用到的是MySQLI  是不区分大小写 ...