文档章节

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

闪电
 闪电
发布于 2015/06/06 10:26
字数 1393
阅读 19
收藏 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编译-Android基础篇

9/27/2016 1:28:27 PM 深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle一些...

小米墨客
2016/10/12
3.6K
7

没有更多内容

加载失败,请刷新页面

加载更多

区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
12分钟前
0
0
自定义函数及内部函数

变量的作用域 局部变量 global $Global及其他超全局数组 静态变量 仅初始化赋值 保留于内存直到response才销毁 global和static变量的区别 global:局部变量全局话 static:定义静态局部变量 函...

关元
13分钟前
0
0

中国龙-扬科
25分钟前
1
0
python包

https://www.lfd.uci.edu/~gohlke/pythonlibs/

陆朋
35分钟前
1
0
一文弄懂“分布式锁”,一直以来你的选择依据正确吗?

本文主要会关注的问题是“分布式锁”的问题。 多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。 常见的分布式锁实...

Java干货分享
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部