文档章节

Gradle-user guide-第6章 构建脚本基础(译) --续

闪电
 闪电
发布于 2015/06/06 10:26
字数 1393
阅读 16
收藏 0
第6章 构建脚本基础(6.6-6.14)
6.6动态任务
Groovy不仅仅能够定义一个任务做什么,例如,它也能够动态的创建任务。
例子6.8任务的动态定义

build.gradle

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
使用gradle -q task1 ,输出如下:
> gradle -q task1
I'm task number 1
 
6.7操作存在的任务
一旦任务被创建,它就可以通过api来访问,这是与Ant不同的,如,创建额外的依赖。
例子6.9通过API访问任务--增加依赖

build.gradle

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
task0.dependsOn task2, task3

> gradle -q task0
I'm task number 2
I'm task number 3
I'm task number 0  
或者你可以为一个现存的任务添加行为
例子6.10通过API访问任务--增加行为

build.gradle

task hello << {
    println 'Hello Earth'
}
hello.doFirst {
    println 'Hello Venus'
}
hello.doLast {
    println 'Hello Mars'
}
hello << {
    println 'Hello Jupiter'
}

> gradle -q hello
Hello Venus
Hello Earth
Hello Mars
Hello Jupiter
doFirst  doLast 可以被多次执行。它们在任务动作列表的开始和结束加入动作。当任务执行的时候, 在动作列表里的动作将被按顺序执行。 << 操作符仅仅是 doLast 的一个别名。

6.8快捷标记

正如你已经注意到了,在之前的例子中,有一个快捷标记来访问存在的任务,每一个任务都可以作为构建脚本的属性。

例子6.11将任务作为构建脚本的属性来访问

build.gradle

task hello << {
    println 'Hello world!'
}
hello.doLast {
    println "Greetings from the $hello.name task."
}

> gradle -q hello
Hello world!
Greetings from the hello task.
这使代码很有可读性,特别是当使用了由插件(如编译)提供的任务时。
6.9附加任务属性
可以在给任务添加自定义属性,如添加一个叫myProperty的属性,然后给这个属性设置一个初始值,从这一点来看,该属性可以被读取和设置,就像一个预定义的属性一样。
例子6.12给任务添加附加属性

build.gradle

task myTask {
    ext.myProperty = "myValue"
}
task printTaskProperties << {
    println myTask.myProperty
}

> gradle -q printTaskProperties
myValue
附加属性不只是限于任务,在13.4.2中将会了解到更多相关的内容。
6.10使用Ant任务
Ant任务是Gradle的一等公民。Gradle 通过 GroovyAnt 任务提供了出色的集成。Groovy有很好的AntBuilder,在Gradle使用 Ant任务和在build.xml中使用一样的便利,甚至是更加强大。下面的例子,你可以学习如何去执行ant任务,以及如何访问ant属性。
例子6.13使用AntBuilder执行ant.loadfile目标

build.gradle

task loadfile << {
    def files = file('../antLoadfileResources').listFiles().sort()
    files.each {File file ->
        if(file.isFile()){
            ant.loadfile(srcFile:file,property:file.name)
            println "*** $file.name ***"
            println "${ant.properties[file.name]}"
        }

    }
}

> gradle -q loadfile
*** agile.manifesto.txt ***
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration  over contract negotiation
Responding to change over following a plan
 *** gradle.manifesto.txt ***
Make the impossible possible, make the possible easy and make the easy elegant.
(inspired by Moshe Feldenkrais)
build脚本中你可以用Ant脚本做很多事情。你将会在第17章中学习到更多相关内容。
6.11使用方法
Gradle可以衡量你组织构建逻辑的能力,第一个级别就是使用方法。

例子6.14使用方法来组织你的构建逻辑

build.gradle

task checksum <<{
    fileList('../').each {File file ->
        ant.checksum(file:file,property:"cs_$file.name")
        println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
    }
}
task loadfile <<{
    fileList("./").each {File file ->
        ant.loadfile(srcFile:file,property:file.name)
        println "i'm fond of $file.name"
    }
}

File[] fileList(String dir){
    file(dir).listFiles({file->file.isFile()} as FileFilter).sort()
}
> gradle -q loadfile

I'm fond of agile.manifesto.txt

I'm fond of gradle.manifesto.txt

之后你将会看到,上面定义的那种方法能在多项目构建中被子项目共享,如果你的构建逻辑变得更加复杂,Gradle为你提供了非常便利的方式去组织你的构建逻辑。我们会用一整个章节去阐述组织构建逻辑这一主题。参考59章节。

612默认任务

Gradle允许为你的构建定义一个或多个默认任务。

例子6.15定义默认任务

build.gradle

defaultTasks 'clean' ,'run'
task clean <<{
    println "default cleaning"
}
task run <<{
    println "default running"
}
task other<<{
    println "other"
}

> gradle -q

Default Cleaning!

Default Running!

上面的命令相当于“gradleclean run”,在多项目构建中,每个子项目可以有自己特有的默认任务,如果一个子项目没有指定其默认任务,它会使用其父项目的默认任务作为自己的默认任务。

613DAG配置

我们之后会详细描述(参考55章,构建的生命周期),gradle有配置阶段和执行阶段。在配置阶段之后,Gradle知道了应该被执行的所有任务,gradle提供了一个钩子(hook去利用这些信息。一个用法就是,检查发布的任务时候在将要执行的任务之中,然后据此给某些变量赋不同的值。

在接下来的例子中,“distribution ”“release”任务的执行会导致变量version具有不同的值。

例子6.16不同的结果取决于选择的任务

build.gradle

task distribution <<{
    println "we build the zip with version=$version"
}
task release(dependsOn:'distribution')<<{
    println 'we release now'
}
gradle.taskGraph.whenReady {taskGraph ->
    if(taskGraph.hasTask(release)){
        version = '1.0'
    }else{
        version='1.0-SNAPSHOT'
    }
}

> gradle -q distribution

We build the zip with version=1.0-SNAPSHOT

> gradle -q release

We build the zip with version=1.0

We release now

重要的是,whenReadyrelease任务执行之前就已经影响了release任务,即使release不是首要任务。(首要任务指传递给gradle命令的任务)

614下一步去哪里

在这整个第六章节里,我们对任务进行了初探,这并不是任务的全部,如果你想要跳到更多的细节,请参见第15章节。

本文转载自:http://blog.csdn.net/tudayu123/article/details/38456253

共有 人打赏支持
闪电
粉丝 74
博文 392
码字总数 6789
作品 0
海淀
技术主管
读书笔记--Android Gradle权威指南(上)

最近看了一本书《Android Gradle 权威指南》,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所以打算写一篇读书笔记,将书中一些我个人觉得蛮有用的点记录、总结一下。 前言 首先,...

请叫我大苏
05/24
0
0
「译」JUnit 5 系列:环境搭建

原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发: Linesh 的博客:环境搭建 我的 Github:http://github.com/linesh-simplicity 2015年11月,......

Linesh
2016/09/17
54
0
Gradle入门系列(5):创建多项目构建

转载: 本文由 伯乐在线 - JustinWu 翻译,黄利民 校稿。未经许可,禁止转载! 英文出处:petrikainulainen。欢迎加入翻译组。 尽管我们可以仅使用单个组件来创建可工作的应用程序,但有时候...

低至一折起
2017/12/05
0
0
bboss/pinpoint-plugin-generate

This is a pinpoint agent plugin generate tool. 以分布式全文检索elasticsearch客户端框架bboss elasticsearch为实例,介绍服务调用链路日志采集插件的生成及集成方法, 需要被拦截监控的b...

bboss
09/02
0
0
Gradle入门系列(3):依赖管理

转载: 本文由 伯乐在线 - JustinWu 翻译。未经许可,禁止转载! 英文出处:Petri Kainulainen。欢迎加入翻译组。 在现实生活中,要创造一个没有任何外部依赖的应用程序并非不可能,但也是极...

低至一折起
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中的移位运算符

国庆给自己放了个小长期二十几天,回来继续更新专栏 上一篇文章我们说了Java里的二进制,知道了计算机是以0和1来处理数据的,在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号...

SuShine
20分钟前
2
0
linux版QQ

下载地址在这 http://yun.tzmm.com.cn/index.php/s/XRbfi6aOIjv5gwj Appimage包不用做什么别的处理,安装啥的都不需要。。找到文件所在目录,终端中修改一下文件的权限 chmod 777 QQ-2017112...

悲催的古灵武士
26分钟前
1
0
咕泡-MyBatis 实用篇作业

1. Mapper在spring管理下其实是单例,为什么可以是一个单例? 首先,mapper 内部不包含 成员字段,无状态单例是安全的 另外,一直存在不用每次调用都new 一个新实例 2. MyBatis在Spring集成下...

职业搬砖20年
29分钟前
2
0
MQTT协议的初浅认识之连接建立

MQTT百科 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布...

亚林瓜子
46分钟前
1
0
OpenStack部署都有哪些方式

对于每一个刚接触到OpenStack的新人而言,安装无疑是最困难的,同时这也客观上提高了大家学习OpenStack云计算的技术门槛。想一想,自己3年前网上偶然接触到OpenStack时,一头茫然,手动搭建一...

tututu_jiang
46分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部