Gradle是CI过程工具,而不是系统。持续集成过程中的构建、自动化测试、打包、发布都可以使用Gradle来完成。而持续进程过程为我们降低各方面成本,提高产品信心,提高产品质量有着非常重要的作用(不要问我为啥)。而我们很多研发人员非常讨厌CI过程,这一点的问题原因是研发人员没有从CI过程中获取任何利益,而且还增加了维护成本。关于这一点等有机会的时候和大家讨论一下《怎么统一研发,质量,测试,管理之间的利益》(统一各方面的利益之后众志成城,万众一心,我们的产品会更上一层楼)。

在使用Gradle过程中发现在Gradle中的很多特性,很多原理都很特别。这里说明几个使用实践。(这里不与makefile,maven,ant进行对比)

1.关于Gradle的执行的过程:
很多介绍Gradle的地方,都说Gradle脚本是一种配置脚本。他们说这句话的原因是因为在Gradle中提供了很多插件,启用插件后直接调用方法闭包进行配置就可以完全完成项目需要的功能。所以,Gradle很多时候都是以配置文件的形式存在的。

但,Gradle的脚本不简单是配置文件。从Gradle执行的三个步骤可以看出:
1>Initialization:Gradle 支持单项目或者多项目构建,在该阶段,Gradle认哪些项目会参与构建,然后为每一个项目创建 Project 对象
2>Configuration:这个阶段就是配置 Initialization 阶段创建的 Project 对象,所有的配置脚本都会被执行
3>Execution:这个阶段 Gradle 会确认哪些在 Configuration 阶段创建和配置的 Task 会被执行,哪些 Task会被执行取决于gradle命令的参数以及当前的目录,确认之后便会执行

大家可以从Gradle执行过程得出,Gradle的使用过程不止配置脚本那么简单。具体可以看:
1>在初始化阶段,Gradle没有指定默认的初始化脚本,必须使用Gradle的命令行参数进行指定。这个过程可以使用Gradle的Hook来完成相应的回调注册,以控制整个Gradle执行过程。

参见:https://docs.gradle.org/current/userguide/init_scripts.html
https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html#org.gradle.api.invocation.Gradle:addListener(java.lang.Object)

2>在配置阶段,执行的是相关的配置。比如说Project中的依赖管理闭包块。属性设置等都会直接执行。但是这个阶段不会执行task内部的action。所以,这个阶段才叫做配置阶段。

3>在执行阶段,会执行task的相关操作。在相对复杂的项目中很多时候需要在执行阶段对项目构建进行动态配置,在这个阶段可以对项目中各种属性在进行配置。但是,动态配置过程必须在使用这些配置之前完成,要不也没有任何用处。

所以,从上面可以得出,Gradle的执行过程不像我们之前接触过的CI工具那样要不是纯配置,要不是纯动态。这一点是Gradle很大的特点。这种方式为我们很好的融合了配置 与 动态构建过程,平衡了两方的优缺点。

2.Gradle配置过程
在脚本执行的时候,Gradle会配置一些特定类型的对象,这些对象就被称为脚本的 delegate 对象,也是构建领域的领域对象,下文简称 DO。
DO 的意义就在于脚本可以使用被代理的对象的方法——这一点非常重要,是脚本中可调用方法的重要来源。
参见:https://www.muzileecoding.com/gradlestudy/gradle-advaced-do.html

只要是被委托对象有的方法,都是可以直接调用的。而且还有一个比较复杂的方法查找过程,一层层的查找方法。所以,在查找在某一部分可以使用的方法是一个比较麻烦的过程。而在Gradle中的文档又写的很晦涩会导致学习成本提升,效率降低等问题。不过一般情况下直接查找DSL相关描述即可。

3.Gradle脚本模块化
模块化过程分两个大类:配置模块化 和 过程模块化。
配置模块化是将Gradle的脚本分模块的写道不同的脚本下,来提高Gradle脚本的可读性与可维护性。具体方法:

apply from: 'other.gradle'

使用apply来引入其他的脚本,但是,在真正使用过程中发现被引入的脚本的委托对象好像不像一般脚本那样。不能直接使用Project一些特定的属性或者task,只能在主脚本中通过不同的方式进行调用。

过程模块化是在被引入脚本中实现过程,方法,类等等,但是需要在主脚本里进行调用。这种方法可以使用Gradle直接调用groovy脚本中的实现来完成,但是,没有找到方法来使Gradle脚本调用groovy脚本。所以,这里的过程模块化还是使用配置模块化来进行引入。不过使用特殊的方式进行方法,类的导出。具体如下:

// Define methods as usual
def commonMethod1(param){
return true
}
def commonMethod2(param){
return true
} // Export methods by turning them into closures
ext{
commonMethod1 = this.&commonMethod1
otherNameForMethod2 = this.&commonMethod2
}

在被引入脚本中使用ext进行导出,在主脚本中就可以正常使用了。

参见:http://stackoverflow.com/questions/18715137/extract-common-methods-from-gradle-build-script
https://docs.gradle.org/current/userguide/organizing_build_logic.html#sec:configuring_using_external_script

4.关于Groovy
在Gradle脚本中可以使用任意合法的Groovy语句。从Groovy的文档可以了解到Groovy是一种可以在运行期和编译器进行元编程的强大语言。元编程又是DSL的强大支撑。所以,Gradle才实现了这么强大的DSL,让我们更容易理解Gradle。
参见:http://www.groovy-lang.org/metaprogramming.html

总结了一些Gradle的实践,但是,这里最主要的核心内容还是怎么提高程序的可理解性,可维护性,可测试性的内容。提高这些更是为了降低成本。

Gradle使用小结的更多相关文章

  1. Gradle学习小结

    build.gradle(依赖配置) // 普通java工程 apply plugin: 'java' // Idea工程 apply plugin: 'idea' // war工程,需要有webap ...

  2. 关于Gradle配置的小结

    前言 使用 Android Studio 来开发 Android 工程的过程中,接触 Gradle 是不可避免的,比如配置签名.引入依赖等.那么 Gradle 到底是什么东西呢? Gradle 是一个 ...

  3. Java Gradle入门指南之内建与定制任务类(buildSrc、Groovy等)

        上一篇随笔介绍了Gradle的安装与任务管理,这篇着重介绍Gradle的内建任务(in-built tasks)与自定义任务(custom tasks),借助Gradle提供的众多内建任务类型 ...

  4. Android studio:Groovy 与 Gradle 基础【三】

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=255064&extra=page%3D2%26filter%3Dautho ...

  5. Android拓展系列(12)--使用Gradle发布aar项目到JCenter仓库

    目的 发布自己的android library(也就是aar)到公共的jcenter仓库,所有的人都能用gradle最简单的方式引用. 为什么选择jcenter,它兼容maven,而且支持更多形式仓库 ...

  6. 学习笔记——Maven实战(六)Gradle,构建工具的未来?

    Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...

  7. Spring boot中使用springfox来生成Swagger Specification小结

    Rest接口对应Swagger Specification路径获取办法: 根据location的值获取api   json描述文件 也许有同学会问,为什么搞的这么麻烦,api json描述文件不就是h ...

  8. Maven、gradle、Ant、Eclipse IDE

    Maven.gradle.Ant.Eclipse IDE之间的关系 http://wenku.baidu.com/view/d33208810912a21615792910.html?from=sea ...

  9. Gradle在大型Java项目上的应用

    在Java构建工具的世界里,先有了Ant,然后有了Maven.Maven的CoC[1].依赖管理以及项目构建规则重用性等特点,让Maven几乎成为Java构建工具的事实标准.然而,冗余的依赖管理配置. ...

随机推荐

  1. mvc ef LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。

    private sys_User GetUserInfo() { sys_User model = null; var userId = Convert.ToInt32(AccountHelper.G ...

  2. LeakCanary 内存检测 工具 --超级傻瓜 不会DDMS的福音

    大神资料贴出 ,学习  ,集成到项目中 . LeakCanary 中文使用说明     http://www.liaohuqiu.net/cn/posts/leak-canary/ logcat 显示 ...

  3. 数据结构与算法分析C++表述第二章编程题

    把昨天看的第二章巩固一下,做一做编程习题. 2.6: 第一天交2元罚金,以后每一天都是前一天的平方,第N天罚金将是多少? 这个题目和2.4.4-3介绍的幂运算基本一致.若按相同的递归思路分析,比那个问 ...

  4. 软件测试基础homework2

    1.for循环里的i>0应该改为i>=0 test1:x=[3,2,5];y=2 test2:x=[3];y=2 test3:x=[2,3,5];y=4 2.for循环里的i应该倒序 te ...

  5. WP8.1 C#代码 添加/获取Grid.ColumnDefinitions/RowDefinitions

    WP8.1: ColumnDefinitions和RowDefinitions的道理是相同的,语法顺序是一样的,只不过是将ColumnDefinitions换成RowDefinitions而已 获取并 ...

  6. spark shell

    启动spark-shell客户端 启动集群模式 本机为master节点 export MASTER=spark://`hostname`:7077bin/spark-shell 或者 bin/spar ...

  7. SqlServer数据库空间使用情况常用命令

    --最简单的办法就是使用SSM客户端,报表查看 --查询数据文件的空间情况 dbcc showfilestats --查询日志文件的空间情况 dbcc sqlperf(logspace) --查询te ...

  8. .NET 扩展方法(Extention Method)的要点

    扩展方法Extention Method的主要介绍在:http://msdn.microsoft.com/zh-cn/library/bb383977(v=vs.100).aspx. 扩展方法的意义在 ...

  9. 也谈微信小程序

      小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下即可打开应用.也体现了"用完即走"的理念,用户不关心是否安装太 ...

  10. linux-----------centos上搭建了lnmp环境,项目也上传上去了,刚开始没事,后来重启了以后就不行了。

    关闭防火墙就可以了.或者你打开防火墙对80端口的限制. systemctl stop firewalld.service #停止firewall systemctl start firewalld.s ...