Gradle:构建脚本概要
一、构建块
1.每一个构建块都包括三个基本构建块:project、task和property;
2.每一个构建块包括至少一个project,进而又包括一个或多个task;
3.project和task暴露的属性能够用来控制构建快;
二、项目
1.一个项目(project)代表一个正在构建的组件(比方,一个JAR文件)。或一个想要完毕的目标。如部署应用程序;
2.每一个Gradle构建脚本至少定义一个项目,当构建启动后。Gradle基于build.gradle中的配置实例化org.gradle.api.Project类。并且能够通过project变量使其隐式可用。
3.一个project能够创建新的task,加入依赖和配置,并应用插件和其他构建脚本;
//不显式使用project变量的情况设置项目描写叙述
setDescription("myProject");
//在不使用project变量的情况通过Groovy语法类訪问name和description属性
println "Description of project $name:" + project.description
三、任务
1.Task的一些重要功能:任务动作(task action)和任务依赖(task dependency);
2.任务定义了一个当任务运行时最小的工作单元,能够简单到仅仅打印“Hello world!”,或复杂到编译Java源码。
四、属性
1.每一个Project和Task实例都提供了能够通过getter和setter方法訪问的属性;
2.一个属性可能是一个任务的描写叙述或项目的版本号;
3.扩展属性:Gradle的非常多领域模型提供了特别的属性类型,在内部以键值对的形式存储;
//仅仅在初始生命扩展属性时须要ext命令空间
project.ext.myPro = 'myValue'
ext {
someOtherProp = 123
} //使用ext命令控件訪问属性是可选的
assert myProp == 'myValue'
println project.someOtherProp
ext.someOtherProp = 567
4.Gradle属性:
- Grale属性能够通过在gradle.properties文件里声明直接加入到项目中。这个文件位于<USER_HOME>/.gradle文件夹或项目文件夹下。这些属性能够通过项目实例訪问。 
- 即使你有多个项目。每一个用户也仅仅能有一个Gradle属性文件在<USER_HOME>/.gradle文件夹下。 
gradle.properties文件:
examplePro = myValue
someOtherProp = 455
能够通过例如以下方式訪问项目两个变量:
assert project.exampleProp == 'myValue'
task printGradleProperty << {
println "Second property:$someOtherProp"
}
5.声明属性的其他方式:Gradle也提供了非常多其他方式为构建提供属性。比方:
- 项目属性通过-P命令行选项提供; 
- 项目属性通过-D命令行选项提供。 
- 环境变量依照以下的模式提供:ORG_GRADLE_PROJECT_propertyName=someValue 
五、使用Task
1.声明task动作:
- 动作(action)就是在task中合适的地方放置构建逻辑; 
- Task接口提供了两个不相关的方法来声明task动作:doFirst(Closure)和doLast(Closure)。 
- 当task被运行的时候,动作逻辑被定义为闭包參数一次运行; 
version = '1.0-SNAPSHOT' //声明一个包括doFirst和doLast的task
task printVersioin {
doFirst {
println "Before reading the project version"
} doLast {
println "Version: $version"
}
} //在动作列表的開始加入doFirst闭包
printVersion.doFirst { println "First action" }
//使用doLast别名在动作列表的最后加入闭包
printVersion << { println "Last action" }
六、訪问Default属性
task printVersion << {
    logger.quiet "Version: $version"
} 
//在创建task时候。为这两个属性设置值作为參数
task printVersion(group: 'versioning', description: 'Prints project version.') << {
    logger.quiet "Versioin: $version"
} 
task printVersion {
    //通过getter和setter方法来设置属性
    group = 'versioning'
    description = 'prints project version.' 
    doLast {
        logger.quiet "Version: $version"
    }
} 
七、定义Task依赖
1.dependsOn方法同意声明一个或多个task。以下清单显示了使用dependsOn方法应用task依赖的不同方式:
build.gradle文件:
task first << { println "first" }
task sencond << { println "second"} 
//指定多个task依赖
task printVersion { dependsOn: [second, first] } << {
    logger.quiet "Version:$version"
}
task  third << { println "third" }
third.dependsOn{ 'printVersion ' }
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_01-task-dependencies>gradle -q third
first
second
Version: 0.1-SNAPSHOT
third
2.Gradle的思想是声明在一个给定的task之前什么该运行,而未定义他该怎样运行;
3.在Gradle中,运行顺序是由task的输入/输出规范自己主动确定的:
- 一方面,不须要知道整个task依赖链上的关系是否发生改变; 
- 还有一方面。由于构建没有严格的运行顺序。也就是支持task的并行运行,这样能够极大的节约构建运行时间; 
八、终结器task
在实践中。你会发现所依赖的task运行后须要清理某种资源。典型的样例就是Web容器须要对已经部署的应用程序进行集成測试。
1.终结器task:即使终结task失败了,Gradle的task也会按预期运行;
build.gradle文件:
task first << { println "first" }
task second << { println "second" }
//声明一个task被还有一个task终结
first.finalizedBy second 
运行脚本:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\finalizer-task>gradle -q first
first
second
九、加入随意代码
1.通过POGO来表示项目的版本号:
build.gradle文件:
//依据java.lang.Object表示的version属性;Gradle总是调用toString()来获取version的值
version = new ProjectVersion(0, 1) class ProjectVersion {
Integer major
Integer minor
Boolean release ProjectVersion(Integer major, Integer minor) {
this.major = major
this.minor = minor
this.release = Boolean.FALSE
} ProjectVersion(Integer major, Integer minor, Boolean release) {
this(major, minor)
this.release = release
} @Override
String toString() {
//仅仅有当release属性值为false的时候,版本号上才会加入-SNAPSHOT后缀
"$major.$minor${release ? '' : '-SNAPSHOT'}"
}
} task printVersion << {
logger.quiet "Version: $version"
}
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_02-project-version-pogo>gradle printVersion
:printVersion
Version: 0.1-SNAPSHOT BUILD SUCCESSFUL
十、理解task配置
1.Task定义没有使用左移操作符(<<),Gradle称之为task配置;
2.task配置块永远在task动作运行之前被运行。
version.properties文件:
major=0
minor=2
release=false
build.gradle文件:
//Project接口提供了file方法;它会创建一个相对于项目文件夹的java.io.File实例
ext.versionFile = file('version.properties') //没有使用左移操作符定义task配置
task loadVersion {
project.version = readVersion()
} ProjectVersion readVersion() {
logger.quiet 'Reading the version file.' //假设版本号文件不存在,将抛出GradleException异常,带有对应的错误消息
if (!versionFile.exists()) {
throw new GradleException("Required version file does not exist: $versionFile.canonicalPath")
} Properties versionProps = new Properties() //Groovy的文件实现通过加入新的方法来读取InputStream
versionFile.withInputStream { stream ->
versionProps.load(stream)
} //在Groovy中,假设return是方法中最后一条语句的话,则能够省略它
new ProjectVersion(versionProps.major.toInteger(), versionProps.minor.toInteger(), versionProps.release.toBoolean())
} task printVersion << {
logger.quiet "Version: $version"
} class ProjectVersion {
Integer major
… …
}
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_03-configuration-task>gradle printVersion
Reading the version file.
:printVersion
Version: 0.2-SNAPSHOT BUILD SUCCESSFUL Total time: 3.552 secs
3.不管什么时候运行Gradle构建。都会运行三个不同的生命周期阶段:
- 初始化阶段:Gradle为项目创建了一个Project实。 
- 配置阶段:适合于项目或指定task设置所需的配置,项目每一次构建的不论什么配置代码都能够被运行-即使你仅仅运行gradle tasks。 
- 运行阶段:全部task都应该以正确的顺序运行,运行顺序由它们依赖决定的。假设任务被觉得没有改动过。将被跳过; 
十一、声明task的inputs和outputs
1.Gradle通过比較两个构建task的inputs和outputs来决定task是否是最新的,仅仅有当inputs和outputs不同一时候,task才运行。否则将跳过。
version.properties文件:
major=0
minor=1
release=true
build.gradle文件:
ext.versionFile = file('version.properties') 
task loadVersion {
    project.version = readVersion()
} 
ProjectVersion readVersion() {
    … …
} 
task makeReleaseVersion(group: 'versioning', description: 'Makes project a release version.') {
    //在配置阶段声明inputs/outputs
    //声明版本号的release属性作为输入
    inputs.property('release', version.release)
    //由于版本号文件被改动了,所以它被声明作为输出文件属性
    outputs.file versionFile 
    doLast {
        version.release = true
        //Ant task的propertyfile提供了一个遍历的方式来改动属性文件
        ant.propertyfile(file: versionFile) {
            entry(key: 'release', type: 'string', operation: '=', value: 'true')
        }
    }
} 
class ProjectVersion {
    … …
} 
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_05-task-inputs-outputs>gradle makeReleaseVersion
Reading the version file.
:makeReleaseVersion BUILD SUCCESSFUL Total time: 4.775 secs
//Gradle已经知道项目版本号被设置为公布版本号,并且自己主动跳过task的第二次运行
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_05-task-inputs-outputs>gradle makeReleaseVersion
Reading the version file.
:makeReleaseVersion UP-TO-DATE BUILD SUCCESSFUL Total time: 3.457 secs
十二、编写和使用自己定义的Task
1.自己定义Task包括两个组件。自己定义的task类,封装了逻辑行为。也被称作任务类型。
2.真实的task,提供了用于配置行为的task类所暴露的属性值;
3.可维护性是编写自己定义task类的优势之中的一个,增强的task的长处是可重用性;
version.propertioes文件:
#Mon, 08 Apr 2013 06:40:21 -0400
major=0
minor=1
release=true
build.gradle文件:
ext.versionFile = file('version.properties') 
task loadVersion {
    project.version = readVersion()
} 
ProjectVersion readVersion() {
    … …
} 
//创建一个ReleaseVersionTask类型的task。并通过它的属性赋值来设置输入和输出
task makeReleaseVersion(type: ReleaseVersionTask) {
    release = version.release
    destFile = versionFile
} 
//编写一个继承Gradle默认task实现的自己定义task
class ReleaseVersionTask extends DefaultTask {
    //通过注解声明task的输入/输出
    @Input Boolean release
    @OutputFile File destFile 
    //在构造器中设置task的group和description属性
    ReleaseVersionTask() {
        group = 'versioning'
        description = 'Makes project a release version.'
    } 
    //使用注解声明将被运行的方法
    @TaskAction
    void start() {
        project.version.release = true
        ant.propertyfile(file: destFile) {
            entry(key: 'release', type: 'string', operation: '=', value: 'true')
        }
    }
} 
class ProjectVersion {
    … …
} 
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_07-custom-task-usage>gradle makeReleaseVersion
Reading the version file.
:makeReleaseVersion BUILD SUCCESSFUL Total time: 4.887 secs C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_07-custom-task-usage>gradle makeReleaseVersion
Reading the version file.
:makeReleaseVersion UP-TO-DATE BUILD SUCCESSFUL Total time: 3.45 secs
十三、应用自己定义task的可重用性
project-version.properties文件:
#Mon, 04 Jan 2016 00:51:46 +0800
major=0
minor=1
release=true
build.gradle文件:
ext.versionFile = file('project-version.properties') 
task loadVersion {
    project.version = readVersion()
} 
ProjectVersion readVersion() {
    … …
} 
//为makeReleaseVersion task设置单独的属性值
task makeReleaseVersion(type: ReleaseVersionTask) {
    //POGO版本号表示使用prodReady属性来指示公布标识
    release = version.prodReady
    //指定不同的版本号文件对象
    destFile = new File('project-version.properties')
} 
class ReleaseVersionTask extends DefaultTask {
    @Input Boolean release
    … …
} 
//在还有一个项目中不同的POGO暴露不同的属性
class ProjectVersion {
    Integer min
    Integer maj
    Boolean prodReady 
    @Override
    String toString() {
        "$maj.$min${prodReady ? '' : '-SNAPSHOT'}"
    }
} 
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_09-custom-task-reusability>gradle makeReleaseVersion
Reading the version file.
:makeReleaseVersion BUILD SUCCESSFUL Total time: 4.875 secs
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_09-custom-task-reusability>gradle makeReleaseVersion
Reading the version file.
:makeReleaseVersion UP-TO-DATE BUILD SUCCESSFUL Total time: 3.448 secs
十四、Gradle的内置task类型
1.一个好的回滚策略是必须的,保留一份最新的稳定的应用程序可交付版本号的备份非常重要!
2.你想要运行的task顺序:
make ReleaseVersion->war->create Distribution->backup ReleaseVersion->release
3.task依赖判断:通过使用一个task的输出作为还有一个task的输入,Gradle就能够判断出依赖关系了。
build.gradle文件:
apply plugin: 'war'
ext.versionFile = file('version.properties') task loadVersion {
project.version = readVersion()
} ProjectVersion readVersion() {
… …
} task makeReleaseVersion(group: 'versioning', description: 'Makes project a release version.') << {
version.release = true
ant.propertyfile(file: versionFile) {
entry(key: 'release', type: 'string', operation: '=', value: 'true')
}
} task createDistribution(type: Zip, dependsOn: makeReleaseVersion) {
//隐式引用War task的输出
from war.outputs.files //把全部源文件都放到ZIP文件的src文件夹下
from(sourceSets*.allSource) {
into 'src'
} //为ZIP文件加入版本号文件
from(rootDir) {
include versionFile.name
}
} task backupReleaseDistribution(type: Copy) {
//隐式引用createDistribution的输出
from createDistribution.outputs.files
into "$buildDir/backup"
} task release(dependsOn: backupReleaseDistribution) << {
logger.quiet 'Releasing the project...'
} class ProjectVersion {
… …
}
运行构建:
C:\Users\chengxiang.peng.QUNARSERVERS\GradleSources\gradle-in-action-source\chap
ter04\listing_04_10-built-in-tasks>gradle release
Reading the version file.
:makeReleaseVersion
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:war
:createDistribution
:backupReleaseDistribution
:release
Releasing the project... BUILD SUCCESSFUL Total time: 4.853 secs
Gradle:构建脚本概要的更多相关文章
- Gradle构建脚本基础
		Gradle构建脚本,内部是基于 Groovy 的 DSL(领域特点语言),而Maven是基于XML的,Groovy相比XML更加简洁.灵活和强大. Groovy 因为给 Java 开发人员提供了最大 ... 
- 【Gradle】Gradle构建脚本基础
		Gradle构建脚本基础 Settings文件 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认名为settings.gradle,放在根工程目录下. 设置文件大多数的 ... 
- Android Studio Gradle构建脚本
		Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 构建工具就是对你的项目进行 ... 
- Android Gradle 学习笔记(四):Gradle 构建脚本
		本节我们从整体的角度来介绍一下Gradle. 一.setting.gradle 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认的名字就是setting.gradle, ... 
- 《Gradle权威指南》--Gradle构建脚本基础
		No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ... 
- 【转载】Gradle学习 第六章:构建脚本基础
		转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ... 
- gradle构建工具
		在使用android studio开发android程序时,as就是基于gradle进行构建的,我们只需要通过run就可以编译.打包.安装,非常方便,但是究竟gradle是什么呢? 一.java构建 ... 
- Gradle 1.12 翻译——第十三章 编写构建脚本
		有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ... 
- Gradle系列之构建脚本基础
		原文发于微信公众号 jzman-blog,欢迎关注交流. 前面两篇文章分别介绍了 Gradle 基础知识以及 Groovy 相关基础知识,这也是学习 Gradle 所必需了解的,文章链接如下:: Gr ... 
随机推荐
- 【撸码caffe 二】 blob.hpp
			Blob类是caffe中对处理和传递的实际数据的封装,是caffe中基本的数据存储单元,包括前向传播中的图像数据,反向传播中的梯度数据以及网络层间的中间数据变量(包括权值,偏置等),训练模型的参数等等 ... 
- 关于阿里云oss
			这两天抽时间看了一下阿里云oss,阿里云oss是阿里为大数据推出的开放存储服务,为多种语言预留出了接口,下面是我对php接口的一点理解. 当注册了阿里云oss账号时会得到接口,在config里面填上这 ... 
- Memcached 与 Redis 的关键性能指标比较
			性能对比: Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis在存储小数据时比 Memcached 性 能更高. 而在 100k 以上的数据中,Memcach ... 
- 拖动盒子demo
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- JS排序之冒泡排序
			冒泡排序的两种策略: <script>// 第一种思路:// 一个数组中的数据,拿第一个和剩下的依次进行对比,数值小的赋值给第一个,一轮比较过后,则数值小的放在最前边.// 第二轮比较,则 ... 
- PostgreSQL 满足条件时插入数据
			例如:当表中不存在某记录时,才插入这条记录. INSERT INTO 表名(列名1, 列名2) SELECT '值1', '值2' WHERE NOT EXISTS ( SELECT * FROM 表 ... 
- BigDecimal,注解
			BigDecimal 问题重现 今天在干活的途中,发现一个很坑爹的问题,让我来复现下问题: 从上游接口获得的余额,对于为0的,做了判断 BigDecimal a = new BigDecimal(ac ... 
- Github 团队协作基本流程与命令操作 图解git工作流程
			# 先 fork 项目到自己 github # 1. 从自己仓库克隆到本地(clone 的是项目指定的默认分支,比如 master) git clone git@github.com:me/em.gi ... 
- c++ 优先级队列(priority_queue)
			从网上搜优先级队列用法,都是有些乱七八糟的,有几种用法都没说,直接贴代码.实在郁闷,于是自己在此归纳归纳. 废话不多说,直入主题. 优先级队列的核心是比较函数的实现. 比较函数有两种实现方法: 1.在 ... 
- Java根据HttpServletRequest请求获取服务器的IP地址
			以下总结了两种根据HttpServletRequest请求获取发出请求浏览器客户端所在服务器的IP地址方法: 代码: import javax.servlet.http.HttpServletRequ ... 
