内容简介:原文发于微信公众号 jzman-blog,欢迎关注交流。前面两篇文章分别介绍了 Gradle 基础知识以及 Groovy 相关基础知识,这也是学习 Gradle 所必需了解的,文章链接如下::本文将对 Gradle 整体进行了介绍和学习,了解了 Task、Project 等相关概念以及对使用 Gradle 来构建项目的一些常用操作,主要内容如下:
原文发于微信公众号 jzman-blog,欢迎关注交流。
前面两篇文章分别介绍了 Gradle 基础知识以及 Groovy 相关基础知识,这也是学习 Gradle 所必需了解的,文章链接如下::
本文将对 Gradle 整体进行了介绍和学习,了解了 Task、Project 等相关概念以及对使用 Gradle 来构建项目的一些常用操作,主要内容如下:
- Setting 文件
- Build 文件
- Project 和 Tasks
- 任务的创建
- 任务依赖
- 任务间的交互
- 自定义属性
- 总结
Setting 文件
说一下 Gradle 构建项目的 Setting 文件,该文件主要用来配置当前工程,比如 Android 开发中一个项目中可能有多个子 Module,当不需要某个子 Module 时,可以取消该 Module 在配置文件 Setting 中的配置即可,当然只有在 Setting 文件中配置的子 Module 才会被构建,当然不只是 Android 开发,只要使用 Gradle 构建的项目都一样,Setting 是 Gradle 构建项目默认的配置文件名,下面简单测试一下 Setting.gradle 文件的使用,测试工程目录如下:
├─GradleSetting │ ├─.gradle │ │ ├─4.1 │ │ │ ├─fileChanges │ │ │ ├─fileHashes │ │ │ └─taskHistory │ │ └─buildOutputCleanup │ └─test │ └─Method │ └─.gradle │ ├─4.1 │ │ ├─fileChanges │ │ ├─fileHashes │ │ └─taskHistory │ └─buildOutputCleanup │ build.gradle │ setting.gradle 复制代码
在工程名为 GradleSetting 的工程中 test 文件夹下有一个 Method 的子项目,这里会通过配置 setting.gradle 文件将子项目 Method 构建到 GradleSetting 中,setting.gradle 文件内容如下:
println "---------test----Setting.gradle----------" //输出当前工程目录 println(rootDir) //指定要参与构建的子项目 include ':Method' project(':Method').projectDir = new File(rootDir,'test/Method') 复制代码
来看一下输出结果:
PS E:\Gradle\study\GradleSetting> gradle testGradleSetting ---------test----Setting.gradle---------- E:\Gradle\study\GradleSetting > Configure project : testGradleSetting > Configure project :Method 3 3 30 获取方法返回的结果:30 1 2 3 4 5 BUILD SUCCESSFUL in 2s 复制代码
因为在 setting.gradle 文件中配置了 Method,从输出结果看 Method 确实参与了构建,取消在 setting.gradle 文件中的配置,则不会构建 Method,最好自己验证一下。
上面配置了子项目 Method 所在的位置,如果不指定则默认是与 setting.gradle 同级的目录。
Build 文件
如果选择使用 Gradle 构建项目,则每个项目都有一个 build.gradle 文件,该文件是项目构建的入口,对整个项目的配置生效,可以在根项目配置子项目的一下通用配置,比如配置子项目的仓库为 jcenter,这样子项目中所有的依赖就指向 jcenter 中心库下载,下面是参考代码:
//配置子项目依赖的仓库 subprojects{ repositories{ jcenter() } } //配置全部项目 allprojects{ } ... 复制代码
通过本小节主要了解 build.gradle 文件的作用即可,实际开发中针对不同类型的项目会有更详细的相应配置策略。
Project 和 Tasks
在 Gradle 中有很多 Project,可将某个 Project 打包成 jar 提供给另一个 Project 使用,每个 Project 都是根据其业务需求抽象出来的一个子模块,最终通过 Gradle 构建成完整的项目。
每个 Project 允许有多个 task,Task 理解为任务,task 主要 完成某个具体的功能点,比如 wrapper task 主要就是完成 wrapper 文件的创建。
任务的创建
对于任务的创建已经比较熟悉了,下面使用 task 声明一个任务:
//1. 创建一个任务 task createTask{ doFirst{ println 'doFirst' } doLast{ println 'doLast' } } //2. 使用TaskContainer创建一个任务,Project已经定义的TaskContainer,即tasks tasks.create("createTask1"){ doFirst{ println 'doFirst' } doLast{ println 'doLast' } } 复制代码
task 可以理解为创建任务的关键字,实际上 task 是 Project 里面的一个方法,在 Groovy 中可以省略方法参数上的括号,花括号里的内容是一个闭包,主要是对 task 进行相关配置,doFirst 和 doLast 是 Task 中常用的两个方法,分别会在该 task 开始和结束时执行。
任务依赖
任务之间可以相互依赖,可以控制某个任务执行的先后顺序,比如在运行 A 之前必须先运行 B,此时任务 A 依赖任务 B,具体参考如下代码:
//单任务依赖:通过dependsOn指定要依赖的任务 task B(dependsOn: A){ doFirst{ println 'B' } } task C{ doFirst{ println 'C' } } //多任务依赖 task D{ dependsOn A, C doFirst{ println 'D' } } 复制代码
下面看一下执行多依赖任务 gradle D 的执行结果:
PS E:\Gradle\study\GradleSetting> gradle D > Task :A A > Task :C C > Task :D D BUILD SUCCESSFUL in 2s 复制代码
显然,执行任务 D,其依赖的其他两个任务先执行,控制了任务执行的先后顺序。
注意:脚本是按照顺序执行,如果任务任务 A 和 C 在任务 D 的后面定义,当执行任务 D 的时候肯定会出错。
任务间的交互
创建的任务都有自己的名称,其类型是 Task,那么我们就可以通过 Task API 来控制控制任务的执行,使用任务名操作任务的原理是:Project 在创建任务的时候,已经将该任务对应的任务声明为 Project 对象的一个类型为 Task 的一个属性,测试代码如下:
//任务之间的交互 task E{ println 'hello e' println "E是不是Project的属性:"+project.hasProperty('E') } E.doFirst{ println 'doFirst' } E.doLast{ println 'doLast' } 复制代码
上述代码的执行结果如下:
PS E:\Gradle\study\GradleSetting> gradle E > Configure project : hello e E是不是Project的属性:true > Task :E doFirst doLast BUILD SUCCESSFUL in 1s 复制代码
自定义属性
Project 和 Task 都允许用户添加额外的自定义属性,通过应用所属对应的 ext 属性来实现,添加之后可以通过 ext 属性对自定义的属性进行读取和设置,如果要同时添加多个自定义属性,可以通过 ext 代码块,参考如下代码定义自定义属性:
apply plugin:"java" //自定义单个属性 ext.name1 = "Gradle" //自定义多个属性 ext{ age = 10 score = 100 } //在SourceSet中使用自定义属性 sourceSets.all{ ext.resourceDir = null } //配置自定义属性 sourceSets{ main{ resourceDir = "main/res" } test{ resourceDir = "test/res" } } task customProperty{ println "name=${name1}" println "age=${age}" println "score=${score}" sourceSets.each { println "${it.name} resourceDir is ${it.resourceDir}" } } 复制代码
上述代码的执行结果:
PS E:\Gradle\study\GradleSetting> gradle customProperty > Configure project : name=Gradle age=10 score=100 main resourceDir is main/res test resourceDir is test/res BUILD SUCCESSFUL in 2s 复制代码
自定义属性相较局部变量作用域更加广泛,可以跨 Task、Project 访问自定义属性,只要能访问这些属性所属的对象,那么这些属性就可以被访问到, Android 开发中可以使用自定义属性单独定义版本号、版本名称以及用到的第三方库的版本,将其同意在单独的 gradle 文件中,各 Module 直接获取即可,不仅方便管理依赖库的版本,还在一定程度上提高工作效率。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- golang构建项目的脚本
- 通过Roslyn构建自己的C#脚本(更新版)
- 不得不学之「 Gradle」 ③ 构建脚本基础
- GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本
- 脚本文件里的 Hybrid Script(混合式脚本)
- 脚本错误量极致优化-定位压缩且无 SourceMap 文件的脚本错误
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
海量运维、运营规划之道
唐文 / 电子工业出版社 / 2014-1-1 / 59.00
《海量运维、运营规划之道》作者具有腾讯、百度等中国一线互联网公司多年从业经历,书中依托工作实践,以互联网海量产品质量、效率、成本为核心,从规划、速度、监控、告警、安全、管理、流程、预案、考核、设备、带宽等方面,结合大量案例与读者分享了作者对互联网海量运维、运营规划的体会。 《海量运维、运营规划之道》全面介绍大型互联网公司运维工作所涉及的各个方面,是每个互联网运维工程师、架构师、管理人员不可或......一起来看看 《海量运维、运营规划之道》 这本书的介绍吧!