赞
踩
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。
怎么看上面都是一段很官方的解释,对于入门的人来说简直是一个噩梦般的解释(包括以前的我)。那下面我就用通俗一点语言说说我的理解。
Gradle就是工程的管理,帮我们做了依赖,打包,部署,发布,各种渠道的差异管理等工作。举个例子形容,如果我是一个做大事的少爷平时管不了这么多小事情,那Gradle就是一个贴心的秘书或者管家,把一些杂七杂八的小事情都帮我们做好了,让我们可以安心的打代码,其他事情可以交给管家管。
那有人会问,既然工作都可以交给他做,为什么还要我们去了解。我想我们要管家做事,也要下达我们的命令,我们必须知道这些命令和管家的喜好才能跟他相处和谐,不然你不知道它的脾性下错命令,那后果可是很严重的。
在以前实习的时候,我还用eclipse,那是导入一个网上的下载的module还需要一步步的import。但自从用了Android Studio后,Gradle很贴心的帮我完成了这个繁杂的工作,而且往往只需要添加一句话,这太神奇了,当时我是这样想的,下面我们也会说到这个。
下面我就用自己项目中用到的Gradle慢慢分析:
我们看到,每个Module都会对应有一个Gradle文件,另外还有一个主Project的Gradle文件管理全局。下面我们先看看那个叫gradle-wrapper.properties的文件:
Wrapper是对Gradle的一层包装,便于在团队开发过程中统一Gradle构建的版本号,这样大家都可以使用统一的Gradle版本进行构建。
上面我们看到的图就是Gradle提供内置的Wrapper task帮助我们自动生成Wrapper所需的目录文件。再看看我们Android项目里面自动生成的文件
终于,我们知道这几个自动生成的文件原来是Gradle Wrapper创建出来的。
那下面我们看看gradle-wrapper.properties这个文件的作用
看到项目里面的各个属性,下面再看看每个属性的作用
我们其实最关心的应该是distributionUrl这个属性,他是下载Gradle的路径,它下载的东西会出现在以下的文件夹中
看到了吧,这个文件夹包含了各个版本你下载的Gradle。
当我是初学者的时候老是会遇到一个问题,那就是下图:
导入项目的时候一直会停留在这个界面,这是为什么?其实原因很简单,就是你常用项目的Gradle版本跟你新导入项目的Gradle版本不一致造成的,那怎么解决?我本人自己是这么做的:
下面我们讲讲settings.gradle文件,它其实是用于初始化以及工程树的配置的,放在根工程目录下。
设置文件大多数的作用都是为了配置自工程。在Gradle众多工程是通过工程树表示的,相当于我们在Android Studio看到的Project和Module概念一样。根工程相当于Android Studio的Project,一个根工程可以有很多自工程,也就是很多Module,这样就和Android Studio定义的Module概念对应上了。
我们可以看到这个项目我们添加了7个module,一一对应,如果你的项目添加了项目依赖,那就会出现在这个文件当中。
好了,我们说完settings.gradle文件之后就慢慢进入其他文件了,但是首先我们要解释一下什么是Groovy:
Groovy是基于JVM虚拟机的一种动态语言,它的语法和Java非常相似,由Java入门学习Groovy基本没有障碍。Groovy完全兼容Java,又在此基础上增加了很多动态类型和灵活的特性,比如支持密保,支持DSL,可以说它就是一门非常灵活的动态脚本语言。
一开始我总把Gradle和Groovy搞混了,现在我总把他们的关系弄清楚了。Gradle像是一个软件,而Groovy就是写这个软件的语言,这就很简单明了吧。那下面我们说到的内容都是用Groovy语法写的,但是这个知识点我就暂时不科普了,有兴趣的小伙伴可以去了解一下更深入的Groovy语法。
下面我们就来讲讲主的build.gradle文件:
我们这里,分为四个标签来讲:
1.buildscript
buildscript中的声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等
2.ext
ext是自定义属性,现在很多人都喜欢把所有关于版本的信息都利用ext放在另一个自己新建的gradle文件中集中管理,下面我介绍一下ext是怎么用的:
- 首先我们新建两个文件,分别叫build.gradle和version.gradle
- 然后分别在两个文件中打上相应的代码
- 最后在Android Studio的Terminal移动到相应的文件夹中运行task。
我们可以很神奇的发现,当我们在build.gradle文件中输入了apply from:’version.gradle’这句话,我们就可以读取到该文件下ext的信息。
现在在项目中我也是这种方法统一管理所有第三方插件的版本号的,有兴趣的朋友也可以试试。
3.repositories
顾名思义就是仓库的意思啦,而jcenter()、maven()和google()就是托管第三方插件的平台
4.dependencies
当然配置了仓库还不够,我们还需要在dependencies{}里面的配置里,把需要配置的依赖用classpath配置上,因为这个dependencies在buildscript{}里面,所以代表的是Gradle需要的插件。
下面我们再看看build.gradle(Project)的另一部分代码
allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。
奇怪,有人会问,为什么同一个build.gradle(Project)文件中buildscript和allprojects里面的内容基本上是一样的呢,他们的区别在哪?
buildscript中的声明是gradle脚本自身需要使用的资源,就是说他是管家自己需要的资源,跟你这个大少爷其实并没有什么关系。而allprojects声明的却是你所有module所需要使用的资源,就是说如果大少爷你的每个module都需要用同一个第三库的时候,你可以在
allprojects里面声明。这下解释应该可以明白了吧。
好了,下面该说说build.gradle(Project)文件的最后一个一段代码了
运行gradle clean时,执行此处定义的task。该任务继承自Delete,删除根目录中的build目录。相当于执行Delete.delete(rootProject.buildDir)。其实这个任务的执行就是可以删除生成的Build文件的,跟Android Studio的clean是一个道理。
讲完Project的build文件,就来讲讲最后也是内容最多的文件了。
这种叫做引入Gradle插件,而Gradle插件大致分为分为两种:
在 build.gradle 中引入 springboot插件
- plugins {
- id "org.springframework.boot" version "2.0.3.RELEASE"
- }
相当于 maven中的
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
Gradle 里的任何东西都是基于这两个基础概念:
每一个构建都是由一个或多个 projects 构成的. 一个 project 到底代表什么依赖于你想用 Gradle 做什么. 举个例子, 一个 project 可以代表一个 JAR 或者一个网页应用.
每一个 project 是由一个或多个 tasks 构成的. 一个 task 代表一些更加细化的构建. 可能是编译一些 >
首先应该明白,gradle自带了很多task。
在build.gradle中添加自定义task很简单,代码如下:
- //自定义一个方法,这里是创建目录
- def createDir = {
- path ->
- File file = new File(path);
- if (!file.exists()){
- file.mkdirs();
- }
- }
- //自定义第一个task任务
- task makeGroovyDir(){
- def paths = ["src/main/groovy"];
- doFirst {
- paths.forEach(createDir);
- }
- }
- //自定义第二个task任务
- task makeJavaDir(){
- dependsOn 'makeGroovyDir' //该任务依赖于某个任务
- def paths = ["src/main/java2"];
- doFirst {
- paths.forEach(createDir);
- }
- }
运行图如下:
在build.gradle文件中添加 task 打印出依赖的jar包路径
task showDir {
doLast {
configurations.compile.asFileTree.each{
println it.absoluteFile
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。