Gradle的概念和理解.

Gradle 是个啥,一开始我也没弄清,官方解释是: 
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具 
那么Apache Ant和Apache Maven又是个啥?这个先忽略,那自动化建构工具呢? 
我个人狭义的理解就是软件环境部署和打包的工具,那么.net 也有CruiseControl.Net持续集成 WIX生成安装包,这是类似的东西,只是Gradle这个工具是google的亲儿子,微软在这方面就不怎么给力了,功能强大一点的都是第三方工具。但是微软有一个依赖管理工具不错,就是NuGet,这个跟Gradle的依赖管理可以媲美。

在知乎上,我找到一个解释的特别好的文章,这里贴出来,以防以后链接失效原链接

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。上面是维基上对Gradle的解释,相信一个没有接触过构建的人是不大能看明白的,当初我也是.下面是我对Gradle通俗的理解: 软件开发讲究代码复用,通过复用可以使工程更易维护,代码量更少….. 开发者可以通过继承,组合,函数模块等实现不同程度上的代码复用.但不知你有没有想过,软件开发也是一种工程作业,绝不仅仅是写代码,还涉及到工程的各种管理(依赖,打包,部署,发布,各种渠道的差异管理…..),你每天都在build,clean,签名,打包,发布,有没有想过这种过程,也可以像代码一样被描述出来, 也可以被复用.举个例子我是做Android开发的,你可知道国内有n个Android市场,n个手机品牌,n个手机尺寸……,一般公司都会针对不同的市场单独发包用来统计不同渠道的下载量等情况,可能需要针对不同(品牌,尺寸等各种硬件信息)的手机做一些特殊的处理,这个时候你可以针对不同的情况单独建一个工程,或者更好一点你可以通过一些变量来控制,像这样:if(isMoto){do something} 
else if(isHuawei){do something} 
… 
差异管理但这两种解决方法都有自己的缺点,特别是前一种有极大的代码重复.后一种稍微好一点,但这种方式的差异是运行时的,不是静态的,对于moto手机上的处理逻辑对华为手机来说一点作用也没有,但这一段针对moto手机的处理逻辑也被装到了华为手机上了,通过gradle的productFlavor与buildtype可以实现静态级的差异控制可以参考如何通过Gradle实现一套代码开发不同特性的APK · ByGhui 说到前面的多渠道问题,不同的渠道一般会对应不同的渠道号,你当然可以通过修改一次打一个包这种纯手工的方式来生成你的多渠道包,但据听说国内某团购网站的Android App有100多个渠道.这里出现了什么?重复,反复的去打包而且这些包之前的差异很小(只是渠道号不同),和写代码一样我们应该复用,通过Gradle可以实现一个命令打出所有的渠道包,一个命令打出指定的渠道包.再复杂一点,你可能需要不同的渠道对应不同的签名文件,不同的icon,不同的服务器地址…这些都可以通过Gradle来方便的实现.依赖管理:做软件开发你可能需要依赖各种不同的jar,library.你当然可以通过将.jar/library工程下载到本地再copy到你的工程中,但不知你是否听说过国外有个叫中央仓库的东西,在这个仓库里你可以找到所有你能想到以及你从来没听说过的jar,aar…The Central Repository Search Engine 这里可以找到所有你需要的依赖,而你需要的只是指定一个坐标,如下:剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:依赖不会进入到你的版本控制仓库中(默认会缓存到~/.gradle/下)方便卸载装载依赖(只是一条坐标依赖,不需要删除即可)方便的版本管理,如上图中的2.3.3既是picasso的版本号,若改为+就表示从中央仓库中下载最新的版本不同工程的相同依赖不会存在重复副本(只在~/.gradle下存在一份)项目部署这方面我没怎么接触过,但据我所知通过一些插件,可以实现自动将你的输出(.jar,.apk,.war…)上传到指定仓库,自动部署…罗哩罗嗦说了这么多,不知大家有没有理解总结一下:Gradle是一种构建工具,它可以帮你管理项目中的差异,依赖,编译,打包,部署……,你可以定义满足自己需要的构建逻辑,写入到build.gradle中供日后复用.Gradle不是一种编程语言,它不能帮你实现软件中的任何实际功能通俗的解释肯定是不严谨的解释,不妥之处欢迎讨论.###赞同过百,放出之前相关分享的幻灯片###截止到现在(1432311622353)共收到342个赞同与感谢,再次感谢大家的支持!如果你觉得我的分享对你有帮助,请关注我! 以后我会分享更多更优质的内容给大家.说好的幻灯片在这里(是之前在letv时一次内部分享的幻灯片,内容有删减(涉及到公司具体项目的部分),此幻灯片参考了很多其它的资料,内部的链接很值得大家打开看看)

AS其实就是Intellij IDEA的安卓开发环境特供版(谷歌定制版),Intellij IDEA是有收费版本的IDE。Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具,Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。Gradle通过编写一个名为build.g…

AS其实就是Intellij IDEA的安卓开发环境特供版(谷歌定制版),Intellij IDEA是有收费版本的IDE。Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具,Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。Gradle通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对项目进行构建(复杂的项目也有其他文件)Gradle 脚本本质上就是Groovy脚本,只不过高度利用了groovy的语法糖,例如省略方法参数括号和省略句尾分号等,让代码看起来像DSL。所以几乎所有java和groovy支持的语法,它的脚本都支持。(使用JAVA和GROOVY的SDK应该也是没问题的)Gradle支持基于惯例的构建,并有丰富的适合不同情景下的插件库,光有官方用户手册支持的就有20多种,方便构建。Gradle里有两个基本概念:项目(projects)和任务(tasks)。项目由多个任务组成,一个项目可以理解为提供给不同设备的构建版本,如桌面版、网页版、安卓版、iOS版等等,也可以理解为一种行为,例如部署应用到生产环境。任务相当于Ant的target,可以理解成一个构建中原子性的工作,例如编译、打包、执行等。需要注意的是,Ant中他自己的命令例如javac、copy等也叫做task,但Ant的task远没有Gradle的task那么自由。Gradle的构建分两个阶段,第一阶段是设置阶段(configuration phase),分析构建脚本,处理依赖关系和执行顺序等,脚本本身也需要依赖来完成自身的分析。第二阶段是执行阶段(execution phase),此阶段真正构建项目并执行项目下的各个任务。Ant与Maven对于Gradle,前者编写容易,但功能有限,需要人工操作的过程也多;后者依托于庞大的依赖仓库,因此有着强大的外部依赖管理,但添加本地依赖并不方便,且项目不能灵活修改。而Gradle能很好地结合Ant与Maven各自的优点,可以随意的编写任务并组合成项目,直接利用Maven仓库,并且能很好的支持传递依赖和内部依赖。(本部分为个人主观意见,可能与大多数人的意见并不相同)(其实也都是别人的个人主观意见,来源于我当初搜索的Gradle相关文章内容)通俗一点类比成吃饭的话,大致就是:Ant是自己买菜洗菜烧水做饭,Maven是去饭店点餐,Gradle是3D打印食物。

你都说了要通俗的理解,那就用不着学习什么理论了,通俗着来就是了。通俗的说:gradle是打包用的。你觉得解决你的问题了吗?如果没解决,那是你的问题提得不够好。比如我猜你应该提:为什么要打包发布,打包发布有几种常见方法,为什么这些常见方法中要选gr…

你都说了要通俗的理解,那就用不着学习什么理论了,通俗着来就是了。通俗的说:gradle是打包用的。你觉得解决你的问题了吗?如果没解决,那是你的问题提得不够好。比如我猜你应该提:为什么要打包发布,打包发布有几种常见方法,为什么这些常见方法中要选gradle,等等。针对我猜的这些内容,通俗的讲是这样的:以在eclipse里面写java程序为例为什么需要打包:最初写完了,直接右键run就可以了。但是程序写完了毕竟是要发布到服务器上或者给别人用的,你第一不可能让所有要运行的人都装个eclipse,第二不可能把源代码公布给所有人。所以你需要把你的代码发布成二进制形式,让其它环境方便运行,这就是打包。为什么用ant打包的时候要做很多事,比如说配置文件中的用户名和密码,你本地开发和程序实际运行时的内容肯定不一致,所以需要有两个文件,开发的时候用一个,实际运行的时候用一个。这样每次打包的时候都要重复的做这些事,ant可以让你用xml的形式把这些事情写成脚本,然后自动运行。为什么用maven你的项目要用很多jar包,比如你写日志要用个log4j吧,连数据库要用个connector吧。这年头写程序不用个spring都不好意思出门,下载下来的spring包打开一看,密密麻麻的好几十个jar,不知道用哪个不用哪个。而且,即便是你一狠心把这些jar包都放进来,很大可能性还是不能运行,因为还要依赖其它的jar包。哪天想升级个spring小版本,所有jar包都要重来一遍,你也不记得哪些是由于spring引进来的jar包了。所以有了maven,你只要配置一下说我要用spring 3,所有jar包都给你下载好了,你直接运行就行了。赶明儿想升级版本,直接把3改成4,新的jar包也给你下载好了。然后?用了maven,jar包是方便了,但我打包的时候还是有好多事要做啊,然后你会发现maven实在是不知道怎么做这些事,于是开始怀念ant。gradle就是又能干maven的活,又能干ant的活,用groove语言写脚本,表达能力还更强。就这意思。===我也是这两天才看了两眼gradle,了解不深。简化版如下:ant可以自动化打包逻辑。maven也可以自动化打包,相比于ant,它多做的事是帮你下载jar包。但是maven的打包逻辑太死板,定制起来太麻烦,不如ant好用。gradle就是又能自动下jar包,又能自己写脚本,并且脚本写起来还比ant好用的这么个东西。

gradle是一个工程构建工具,java代码,和资源文件需要经过sdk里的一些程序如aapt等处理,才能形成apk包。gradle就是把那些步骤变得简单化。相当于eclipse中的ant吧!

一句话概括就是:依赖管理和任务执行。像Ruby里面的bundler+rake,像iOS中的cocoapods,像node中的npm+grunt.通俗的讲就是:你的项目需要哪些第三方库,它帮你把它们都下载下来,并且编译好放到指定的位置,你就直接可以import后用了。它本身是基于Apache的an…

一句话概括就是:依赖管理和任务执行。像Ruby里面的bundler+rake,像iOS中的cocoapods,像node中的npm+grunt.通俗的讲就是:你的项目需要哪些第三方库,它帮你把它们都下载下来,并且编译好放到指定的位置,你就直接可以import后用了。它本身是基于Apache的ant和maven的,但都不是特别好用,要引入一个库,还得写好多行的XML,麻烦死了。而且他们在任务执行上都比较弱,所以gradle就逐渐发展壮大了并被Google所推崇了
 

猜你喜欢

转载自blog.csdn.net/qq_39792615/article/details/90287854