一.Gradle基础概念
1.1 gradle发布的版本
1.2 gradle wrapper
让项目用固定版本的gradle构建。
比如,如果自己电脑的gradle版本是4.1,但是项目用的是5.1,
那么使用gradle wrapper中指定项目使用的gradle版本是5.1,
就能让项目固定使用5.1版本的gradle。
创建gradle wrapper
gradle wrapper //创建gralde wrapper
./gradlew //通过gradle wrapper 调用gradle
1.3 gradleUserHome
路径 ~/.gradle
- ~/.gradle/wrapper/dists 下载的所有gradle wrapper的版本
- /Users/xuyabo/.gradle/caches/modules-2/files-2.1 gradle依赖下载的jar,aar等文件
1.4 Daemon
gradle会使用一个一直存在的Daemon jvm 加快构建
二.groovy
运行在groovy jvm上的脚本语言
书籍 groovy in acton 2
2.1 对groovy语言机制的理解
new A().print()
java理解:创建一个A对象,然后调用器print方法
grooy理解: 创建一个对象,利用反射查找print方法,然后调用
2.2 闭包(函数)
如下:task函数接受一个字符串和一个闭包作为参数
task("secondTask", {
dependsOn "firstTask"
println "second:configure"
doLast {
println "second:executing"
}
})
2.3 dsl
- http://docs.groovy-lang.org/docs/latest/html/documentation/core-domain-specific-languages.html
- 特性:可以不写括号
例如
//turn(left).then(right)
turn left then right
三.Gradle构建
Gradle构造的三个阶段
- Initailaztion
决定哪些项目参与构建,为工程创建Project对象 - Configuration
对project进行配置,project有哪些task,插件即将build.gradle从上到下跑一遍 - Execution
运行task
task("firstTask",{
println "configure" //配置阶段执行
doLast{
println "executing"//执行阶段执行
}
})
执行 ./gradlew help
执行help任务,因为会配置,所以会打印configure
执行 ./gradlew firstTask
image.png
执行firstTask任务,executing才会打印
Gradle的核心模型
- Project 代表一个项目
- Task
+ doFirst(),doLast(),配置阶段将闭包放入任务列表中,执行阶段才真正执行闭包
+ dependences on 依赖
task("firstTask"){
println "first:configure"
doLast{
println "first:executing"
}
}
task("secondTask"){
dependsOn "firstTask"
println "second:configure"
doLast{
println "second:executing"
}
}
执行结果
./gradlew secondTask
---------
> Configure project :
first:configure
second:configure
> Task :firstTask
first:executing
> Task :secondTask
second:executing
因为firstTask 写在 secondTask后面,所以配置时,先配置firstTask再配置secondTask.
因为secondTask依赖firsttask,所以执行时,先执行firstTask再执行secondTask
- Lifecycle与Hook
- afterEvaluate 在project evaluate后(就是confiuration后)执行
afterEvaluate {
println "afterEvaluate"
}
task("firstTask"){
println "first:configure"
doLast{
println "first:executing"
}
}
task("secondTask"){
dependsOn "firstTask"
println "second:configure"
doLast{
println "second:executing"
}
}
➜ wrapper-demo ./gradlew secondTask
<----
> Configure project :
first:configure
second:configure
afterEvaluate
> Task :firstTask
first:executing
> Task :secondTask
second:executing
插件编写
- 编写简单插件
- 定义一个类继承Plugin
- 调用apply plugin应用插件,及调用MyPlugin的apply参数
在这个例子中MyPlugin生成了task0-task9 10个task
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
(0..10).each {
index ->
def captureId = index
project.task('task' + index) {
doLast {
println("task print" + captureId)
}
}
}
}
}
apply plugin: MyPlugin
- script插件
使用apply from 从url或者本地文件加载插件
网友评论