gradle 构建工具,与Ant Maven关系

时间:2021-03-18 08:53:38

1   基本概念

gradle是一个基于Apache ant 和apache maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml。当前其支持的语言限于java、groovy和scala。

我对gradle的解释:软件开发讲究代码复用,通过复用可以使工程更易维护,代码量更少….. 开发者可以通过继承,组合,函数模块等实现不同程度上的代码复用.但不知你有没有想过,软件开发也是一种工程作业,绝不仅仅是写代码,还涉及到工程的各种管理(依赖,打包,部署,发布,各种渠道的差异管理...),你每天都在build、clean,签名,打包,发布,有没有想过这种过程,也可以像代码一样被描述出来,也可以被复用。

举个例子我是做Android开发的,你可知道国内有n个Android市场,n个手机品牌,n个手机尺寸……,一般公司都会针对不同的市场单独发包用来统计不同渠道的下载量等情况,可能需要针对不同(品牌,尺寸等各种硬件信息)的手机做一些特殊的处理,这个时候你可以针对不同的情况单独建一个工程,或者更好一点你可以通过一些变量来控制,像这样:if(isMoto){do something}
else if(isHuawei){do something}

差异管理这两种解决方法都有自己的缺点,特别是前一种有极大的代码重复,后一种稍微好一点,但这种方式的差异是运行时的,不是静态的。对于moto手机上的处理逻辑对华为手机来说一点作用也没有,但这一段针对moto手机的处理逻辑也被装到了华为手机上了,通过gradle的product Flavor与build type可以实现静态级的差异控制可以参考如何通过gradle实现一套代码开发不同特性的APK。

    依赖管理:做软件开发你可能需要依赖不同的jar library,你当然可以通过将.jar/library工程下载到本地再copy到你工程中,但不知道你是否听说过国外有个*仓库的东西,在这个仓库中你可以找到所有你需要的以及你从来没听说过的jar aar...The Central Repository search engine 这里可以找到你需要的依赖,而你需要的只指定一个坐标,如下:剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:依赖不会进入到你的版本控制仓库中(默认会缓存到~/.gradle/下)方便卸载装载依赖(只是一条坐标依赖,不需要删除即可)方便的版本管理

    总结:gradle是一种构建工具,它可以帮你管理项目中的差异、依赖、编译、打包盒部署。

   gradle通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本进行构建,Gradle脚本本质上就是Groovy脚本,

   gradle里有两个基本概念:项目和任务。项目有多个任何组成,一个项目可以理解为提供给不同设备的构建版本,如桌面版、网页版 安卓版和ios版等。可以理解为一种行为,例如部署应用到生产环境。任务相当于ant中的target。可以理解为一种构建中原子性的工作,例如 编译、打包、执行等。需要注意的是,ant中他自己的命令例如javac copy等也叫做task,但Ant的task远没有Gradle的task那么*。

     gradle的构建分两个阶段,第一阶段是设置阶段,分析构建脚本,处理依赖关系和执行顺序等,脚本本身也需要依赖来完成自身的分析,第二阶段是执行阶段,此阶段正真构建项目并执行项目下的各个任务。Ant与Maven对于Gradle,前者编写容易,但功能有限,需要人工操作的过程也多;后者依托于庞大的依赖仓库,因此有着强大的外部依赖管理,但添加本地依赖并不方便,且项目不能灵活修改。而Gradle能很好地结合Ant与Maven各自的优点,可以随意的编写任务并组合成项目,直接利用Maven仓库,并且能很好的支持传递依赖和内部依赖。(本部分为个人主观意见,可能与大多数人的意见并不相同)(其实也都是别人的个人主观意见,来源于我当初搜索的Gradle相关文章内容)通俗一点类比成吃饭的话,大致就是:Ant是自己买菜洗菜烧水做饭,Maven是去饭店点餐,Gradle是3D打印食物。

2 关于项目导入androidstudio时注意事项

当需要把别的项目导入Android studio中的时候,需要注意三处地方的修改

1 整个project中的build.gradle中的 buildscript的仓库路劲 ,也就是dependencies中的classpath路劲

2 整个项目中的gradle的wrapper/gradle-warpper.properties中的distributionUrl值

3 module中的build.gradle中的compileSdkVersion和buildToolsVersion值,以及dependencies中的compile中的值