本文主要是介绍gradle experience,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
gradle 中的DSL 是Groovy
其中两个概念:
- 取值运算符${}。
在单引号及三引号中不起作用,只在双引号中有效。 - 闭包
Groovy中的闭包是用{参数列表 -> 代码体}表示的代码块,
当参数 <= 1个时,-> 箭头可以省略,
同时当只有一个参数时,如果不指定参数名默认以it为参数名,
在Groovy中闭包对应的类型是Closure,所以闭包可以作为参数传递,
同时闭包有一个delegate字段, 通过delegate可以把闭包中的执行代码委托给任意对象来执行。
另外闭包的介绍:[Android Gradle] 搞定Groovy闭包这一篇就够了 - 简书
以下介绍闭包的概念,参考来源两处:
Groovy 闭包 - 简书
[Android Gradle] 搞定Groovy闭包这一篇就够了 - 简书
闭包的几种写法及使用方法:
{ item++ } { -> item++ } { println it } { it -> println it } { name -> println name } { String x, int y -> println "hey ${x} the value is ${y}"
}{ reader -> def line = reader.readLine()line.trim()
}
同时对于闭包,其隐式参数it
总是存在,即使我们省去->
操作符。除非我们显式在闭包的参数列表上什么都不指定。
def magicNumber = { -> 42 } //显示指定闭包没有参数
使用可变参数的闭包
def concat1 = { String... args -> args.join('') } //可变参数,个数不定
我们可以将闭包赋给变量,然后可以将变量作为函数来调用,或者调用闭包的call方法也可以调用闭包。闭包实际上是groovy.lang.Closure
类型,泛型版本的泛型表示闭包的返回类型。
def fun = { println("$it") }
fun(1234)Closure date = { println(LocalDate.now()) }
date.call()Closure<LocalTime> time = { LocalTime.now() }
println("now is ${time()}")
groovy 闭包可以修改委托对象和委托策略。
-
this 永远是指向定义该闭包的类,如果存在内部类,则是最内层的类,但this不是指当前闭包对象
-
owenr 永远是指定义该闭包的类或者闭包,顾名思义,闭包只能定义在类中或者闭包中
-
delegate 默认是指owner,可以自己设置。就是将闭包和一个具体的对象关联起来
delegate: n. 代表、委员会成员;v. 授权,把...委托给;选派(某人做某事)
class Person {String name;int age;void eat(String food) {println("你喂的${food}真难吃")}String toString() {return name + " " + age;}
}def cc = {name = "hanmeimei"age = 18eat("pingguo")
}task task1 {Person person = new Person(name:"lilei", age:14)println(person.toString())cc.delegate = personcc.call()println(person.toString())
}输出结果:lilei 14
你喂的pingguo真难吃
hanmeimei 18
其中闭包的delegate 写法:cc.delegate = person
可以理解为“名称为cc 的闭包的分配对象 = person”
上面的结果就是为了说明:在闭包(cc) 中可以访问被代理对象(person) 的属性和方法
对于项目中的build.gradle 文件中的语法,比如:
plugins {id 'java-library'
}repositories {mavenCentral()
}dependencies {testImplementation 'junit:junit:4.13.1' api 'org.apache.commons:commons-math3:3.6.1' implementation 'com.google.guava:guava:30.0-jre'
}
其中plugins、repositories、dependencies,都是方法,后面跟的大括号,不是方法体,而是方法的参数,是一个闭包参数,这里省略了括号。
id 'java-library' 就是调用一个id的方法而已。
参考:build.gradle配置文件与Groovy闭包语法之间的关系_⑥②专栏-CSDN博客
build.gradle 中的代码是否为标准groovy:
Gradle 创建 Task 的写法不是 Groovy 的标准语法吧? - 云+社区 - 腾讯云
以下参考:Gradle的快速入门学习 - 掘金
gradle init 会自动生成模板,包含以下内容
gradle 生成的项目的结构:
build.gradle
表示Gradle的项目,构建脚本
一个build.gradle就对应一个项目,
build.gradle放在Gradle项目的根目录下,表示它对应的是根项目,
build.gradle放在Gradle项目的其他子目录下,表示它对应的是子项目
settings.gradle
它表示Gradle的多项目配置脚本
存放在Gradle项目的根目录下,
在里面可以通过include来决定哪些子项目会参与构建,
Gradle构建时会为settings.gradle创建一个对应的Settings对象,include也只是Settings接口中的一个方法。
Gradle Wrapper
使用Gradle Wrapper后,就可以统一项目在不同用户电脑上的Gradle版本,同时不必让运行这个Gradle项目的人安装配置Gradle环境
gradle init
执行时会同时执行wrapper
任务,
wrapper
任务会创建gradle/wrapper目录,
并创建gradle/wrapper目录下的gradle-wrapper.jar、gradle-wrapper.properties这两个文件,
还同时创建gradlew、gradlew.bat这两个脚本,它们统称为Gradle Wrapper,是对Gradle的一层包装。
Gradle Wrapper的作用就是可以让你的电脑在不安装配置Gradle环境的前提下运行Gradle项目,
例如当你的Gradle项目被用户A clone下来时,而用户A的电脑上没有安装配置Gradle环境,用户A通过Gradle构建项目时,Gradle Wrapper就会从指定下载位置下载Gradle,并解压到电脑的指定位置,然后用户A就可以在不配置Gradle系统变量的前提下在Gradle项目的命令行中运行gradlew或gradlew.bat脚本来使用gradle命令,假设用户A要运行gradle -v
命令,在linux平台下只需要运行./gradlew -v
,在window平台下只需要运行gradlew -v
,只是把gradle
替换成gradlew
。
Gradle Wrapper的每个文件含义如下:
1、gradlew:用于在linux平台下执行gradle命令的脚本;
2、gradlew.bat:用于在window平台下执行gradle命令的脚本;
3、gradle-wrapper.jar:包含Gradle Wrapper运行时的逻辑代码;
4、gradle-wrapper.properties:用于指定Gradle的下载位置和解压位置;
Gradle的多项目配置
build.gradle 中有两个函数
allprojects
和subprojects
allprojects的配置包括根项目而subprojects的配置不包括根项目
Task
Gradle中主要有Project和Task对象,
Project是Gradle中构建脚本的表示,一个构建脚本(build.gradle)对应一个Project对象,
Task是Gradle中最小的执行单元,它表示一个独立的任务,
Project为Task提供了执行的上下文。
Task是Gradle中最小执行单元,它是一个接口,默认实现类为DefaultTask,
在Project中提供了task方法来创建Task,
所以Task的创建必须要处于Project上下文中(每个build.gradle 就相当于一个project 对象。gradle 中主要有Project 和Task 对象)
自定义Plugin
我们平时是在build.gradle中通过apply plugin: 'Plugin名' 来引用一个Plugin,
而apply plugin中的apply就是指apply方法中的逻辑,
而apply方法的参数project指的就是引用该Plugin的build.gradle对应的Project对象
另外比较不错的教程:
Gradle运用在组件化中丨慕课网教程
这篇关于gradle experience的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!