您的位置:首页 > 移动开发 > Android开发

项目构建工具Gradle详解

2017-08-04 14:44 363 查看

1、Gradle介绍

简单的说,Gradle就是用来构建项目的一个工具。

基于JVM

像Ant一样通用灵活

像Maven一样约定优于配置

支持多工程构建

强大的依赖管理(基于Apache Ivy)

对已有的maven和ivy仓库全面支持

支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下

基于groovy脚本构建,其build脚本使用groovy语言编写

2、Ant、Maven、Gradle比较

创世之初,世上只有Make一种构建工具,后来,其发展为GNU Make。后来由于技术的不断发展,JVM生态圈里出现了三个最流行的构建工具:

Ant

Ant是第一个“现代”构建工具,在很多方面它有些像Make。

Ant的优点是上手比较快,对构建过程的控制直观透明。

Ant的不足在于使用XML作为脚本编写格式,XML本质是层次化的,并不能很好地贴合Ant过程化编程的初衷,在Ant里要表达一个if分支持功能非常的麻烦;项目一大起来,XML文件很快大的无法管理。

Ant一开始没有通过网络进行依赖管理的功能,直到采用了Apache Ivy。

Maven

Maven主要聚焦于依赖管理,实际上用Maven很难写出复杂、定制化的构建脚本,甚至不如Ant。

用XML写的配置文件会变得越来越大,越来越笨重。

Maven的主要优点是生命周期。只要项目基于一定之规,它的整个生命周期都能够轻松搞定,代价是牺牲了灵活性。

Gradle

Gradle结合了前两者的优点,在此基础之上做了很多改进。它具有Ant的强大和灵活,又有Maven的生命周期管理且易于使用。

Gradle不用XML,它使用基于Groovy的专门的DSL,从而使Gradle构建脚本变得比用Ant和Maven写的要简洁清晰。

它使用Apache Ivy来处理Jar包的依赖。

Gradle的成就可以概括为:约定好,灵活性也高。

3、Gradle相关的文件

settings.gradle

这个文件是用来告诉gradle工具你的工程包含了几个模块。

示例:
include ':app',':library'


你可以指定模块的路径。

示例:
project(':app').projectDir = new File('path')


gradle-wrapper.properties

这个文件位于工程根目录下的
build/wrapper
目录下,通过修改
gradle-wrapper.properties
文件中的
distributionUrl
,可以指定需要下载的gradle版本;

下载的功能是通过另外一个文件
gradle-wrapper.jar
完成的。

gradle.properties

一个配置文件,里面可以定义一些常量。

gradlew和gradlew.bat

分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。

build.gradle

进行工程打包的一些配置,这里就不赘述了。

4、Gradle任务

1. 创建一个任务

task helloTask{
println '在这里进行任务配置'
doFirst{
println '任务执行前做的事'
}
doLast{
println '任务执行后做的事'
}
}


2. 任务依赖

假设现在我们已经创建好了TaskA、TaskB、TaskC。

dependsOn

TaskC dependsOn TaskA, TaskB


这里表示TaskA和TaskB会先执行,然后再执行任务TaskC。

shouldRunAfter

TaskA和TaskB哪个先执行是不一定的。

taskB.shouldRunAfter TaskA


taskA先于TaskB执行。

finalizedBy

我们再新建一个任务TaskD。

taskC finalizedBy TaskD


当我们执行任务taskC时,任务的执行顺序是TaskA->TaskB->TaskC->TaskD。

5、Gradle生命周期

先读取
settings.gradle
,然后是顶层的
build.gradle
,最后是各个模块的
build.gradle


project.beforeEvaluate {
println '在读取build.gradle文件前'
}

project.afterEvaluate {
println '在读取build.gradle文件后'
}

project.getGradle().addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
println '构建开始时'
}

@Override
void settingsEvaluated(Settings settings) {
println '读取settings.gradle的时候'
}

@Override
void projectsLoaded(Gradle gradle) {
println '模块加载时'
}

@Override
void projectsEvaluated(Gradle gradle) {
println '读取模块配置时'
}

@Override
void buildFinished(BuildResult buildResult) {
println '构建完成时'
}
})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息