文档章节

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

闪电
 闪电
发布于 2015/06/06 10:26
字数 1393
阅读 16
收藏 0
点赞 0
评论 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章节。

© 著作权归作者所有

共有 人打赏支持
闪电
粉丝 74
博文 390
码字总数 6789
作品 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 ⋅ 0

读书笔记--Android Gradle权威指南(上)

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

请叫我大苏 ⋅ 05/24 ⋅ 0

Gradle入门系列(5):创建多项目构建

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

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

Gradle入门系列(3):依赖管理

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

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

深入理解gradle编译-Android基础篇

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

小米墨客 ⋅ 2016/10/12 ⋅ 7

用Gradle 构建你的android程序

May 19 2013 用Gradle 构建你的android程序 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构...

打杂程序猿 ⋅ 2013/05/20 ⋅ 13

Android Gradle插件用户指南(译)

Android Gradle插件用户指南(译) 原文Gradle Plugin User Guide - Android Tools Project Site samples see bottom of New Build System 参考Gradle For Android Training Course 1 简介 这篇......

丁佳辉 ⋅ 2016/06/16 ⋅ 0

使用 Gradle 构建 Spring-Boot 的 Docker 镜像

通常我们使用 Dockerfile 来构建项目的Docker 镜像,但是也有需求希望使用 gralde 在编译项目的时候一起把镜像给构建并上传,所以该教程讲解了使用 gradle 编写配置 Dockerfile 并生成镜像的...

mcjiffy ⋅ 01/05 ⋅ 0

gradle :Java项目开发环境构建工具

gradle Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。 中文名 gradle 基 础 Groovy 语言 服务对象 Java应用 整体设计 以作为一种语言为...

惠城君 ⋅ 2015/12/18 ⋅ 0

Gradle 入门--只此一篇

转载自:https://www.jianshu.com/p/001abe1d8e95 是什么? 在语法上是基于Groovy语言的(Groovy 是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语言java的弱类型版本),在项目管理上...

亭子happy ⋅ 06/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部