赞
踩
Groovy是基于JVM虚拟机的一种动态语言,语法和Java非常相似,并增加了很多动态类型和灵活的特性。(闭包、DSL)
括号可以省略,method1(2,3)
和method1 2,3
效果一样
method1(2,3)
method1 2,3 //执行效果和上面一行是一样的
def method1(int a,int b){
println a+b
}
return可以不写,当没有return的时候,Goovy会把方法执行过程中的最后一句代码作为其返回值
def getResult(int a,int b){
if (a > b) a else b
}
代码块(闭包)可以作为参数传递,即{}
可以作为参数传递
list.each({
println it
})
//方法也可以省略,变成我们常看到的样子
list.each {
println it
}
闭包是Groovy一个非常重要的特性,可以说它是DSL的基础。
闭包其实就是一段代码块
customMethod {
println "hello world!"
}
定义了一个方法customMethod
,它只有一个参数,用于接收一个闭包 (代码块),即{}
。
DSL 领域特定语言,Gradle就是一门DSL,基于Groovy,专门用来解决自动化构建的DSL。
起因是自动化构建太复杂、太专业,理解门槛高,为了帮助人们使用,专家们就开发了相关的DSL,名叫Gradle。
我们作为开发者只要按照Gradle DSL定义的语法,书写相应的Gradle脚本就可以达到自动化构建的目的,这也是DSL的初衷。
Groovy断言和Java断言不同,Groovy断言一直处于开启状态,是进行单元测试的首选方式
task method << {
assert 1+2 == 6
}
当断言的条件为false时,程序会抛出异常,不再执行下面的代码,从而可以很清晰地看到发生错误的地方。
asType
可以用于数据类型转换
String a = '123'
def b = a.asType(Integer)
:tasks
./gradlew --refresh-dependencies assemble
可以一个命令执行多个任务
./gradlew clean assemble
驼峰命名可以缩写,比如./gradlew connectCheck
可以使用
./gradlew cc
./gradlew :app:dependencies
使用Android Studio中的
Gradle View
插件,也可以达到同样的效果,且比较主观 / 美观
./gradlew tasks
在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置。设置文件的默认名字是settings.gradle
,放在根工程目录下。
设置文件大多数的作用都是为了配置子工程。
每个Project
都会有一个Build.gradle
文件,该文件是该Project
构建的入口。
Root Project
可以获取到所有的Child Project
,所以在Root Project
的Build
文件里我们可以对Child Project
统一配置,比如应用的插件,依赖的Maven中心库等。
大家不要误以为subprojects
和allprojects
只能配置。他们只是两个方法。
void subprojects(Closure configureClosure);
void allprojects(Closure configureClosure);
接受一个闭包作为参数,对工程进行遍历,遍历的过程中调用我们自定义的闭包,所以我们可以在闭包里配置、打印、输出或修改Project
的属性都可以。
在Gradle中,可以有很多Project,每个Project又是由很多个Task组成的。
Task : 一个操作,比如打个jar包,复制一份文件,编译一次Java代码,上传一个jar到Maven仓库等
task customTask1{
doFirst {
println "customTask1:doFirst"
}
doLast{
println "customTask1:doLast"
}
}
这里的Task看着像一个关键字,其实它是Project对象的一个函数,原型为create(String name,Closure configureClosure)
,参数一是Task的名字,参数二是一个闭包。
最后一个参数是闭包的时候,就可以放到括号外面,然后方法的括号可以省略,就生成了上面的写法,很简洁。
doFirst和doLast方法,分别在Task执行前后输出一段文字。
方式二,使用TaskContainer
进行创建
tasks.create("customTask2"){
doFirst {
println "customTask2:doFirst"
}
doLast{
println "customTask2:doLast"
}
}
dependsOn可以指定其依赖的任务,从而可以确定任务执行的顺序。
Project和Task都运行用户添加额外的自定义属性,要添加额外的属性,通过应用所属对应的ext属性既可实现。
添加之后可以通过ext属性对自定义属性读取和设置,如果要同时添加多个自定义属性,可以通过ext代码块。
//自定义一个Project的属性
ext.age=18
//通过代码块同时自定义多个属性
ext {
phone = 12345678
address="xxxxx"
}
task myTask << {
println "年龄是${age}"
println "电话是${phone}"
println "地址是${address}"
}
相比局部变量,自定义属性有更为广泛的作用域,你可以跨Project,跨Task访问这些自定义属性。只要你能访问这些属性所属的对象,那么这些属性都可以被访问到。
Gradle Wrapper
是对Gradle
的包装,它的作用是简化Gradle
本身的下载、安装和构建。
因为gradle
处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。
所以引入gradle-wrapper
,通过读取配置文件中gradle
的版本,为每个项目自动的下载和配置指定版本的gradle
,我们就不用关心如何去下载gradle
,如何配置到项目中,gradle-wrapper
自动帮我们做了这些事,这样就标准化了项目,从而提高了开发效率。
至于gradlew
也是一样的道理,它共有两个文件,gradlew
是在linux
、mac
下使用的,gradlew.bat
是在window
下使用的,提供在命令行下执行gradle
命令的功能
至于为什么不直接执行Gradle
,而是执行Gradlew
命令呢?
因为就像wrapper
本身的意义,gradle
命令行也是善变的,所以wrapper
对命令行也进行了一层封装,使用同一的gradlew
命令,wrapper
会自动去执行具体版本对应的gradle
命令。
同时如果我们配置了全局的gradle
命令,在项目中如果也用gradle
容易造成混淆,而gradlew
明确就是项目中指定的gradle
版本,更加清晰与明确。
删除C:\Users\你的用户名\.gradle\caches\modules-2\files-2.1\对应包名
文件夹,Gradle就会再重新去拉去最新的maven依赖了。
默认新建的task是会被放到other
组内的,如果我们放到对应的group中,那么我们需要在代码中指定
task uploadArchivesAll(group: 'upload'){
...
}
重新sync项目后,可以看到,upload
组内多了一个uploadArchivesAll
的Task
Task除了可以配置group、description外,还可以配置name、type、dependsOn、overwrite、action
给Task分组之后,该task会被放到指定组中,方便归类查找。(默认被分组到other中)
给Task添加描述,相当于给方法添加注释
执行gradle task的时候,如果想要携带参数,需要加-P
gradlew 你的task名称 -P参数名称=参数值
比如
task hello(){
println("你好啊:"+username)
}
执行命令
gradlew hello -Pusername=heiko
执行结果
你好啊:heiko
tasks.create('a')
tasks.create('b').dependsOn('a')
tasks.create('c')
tasks.create('d').mustRunAfter('c')
如果全局设置 :
task01.dependsOn(task02)
,执行task01的时候,task02会先被执行
参考
《Gradle权威指南》
《Android进阶指北》
关于 Gradle 你应该知道的知识点
Gradle如何传递参数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。