实例讲解Gradle的生命周期与核心概念

Gradle是一个自动化的构建工具。要掌握好gradle的用法,我们需要先对它的生命周期和核心概念有所了解。
Gradle的核心概念有project和task。Gradle的生命周期包括初始化、配置、执行。
下面我们从一个实例来讲解,在其生命周期的三个阶段,针对project和task,都分别做了什么。

1. 工程目录结构

工程目录结构

2. 执行命令

在命令行中执行如下命令

$ gradle :projectA:childA1:world

:projectA:childA1:world标识了一个task的路径。其中:projectA:childA1为project的路径,world为该project中的一个task。
Gradle是如何找到对应的project和task的呢?又是在什么时候执行的task呢?

3. Gradle的生命周期

(1)Initialization-初始化阶段

这个阶段会执行settings.gradle文件,创建project树。
settings.gradle内容如下:

//settings.gradle
println("initialization from settings")
include ":projectA:childA1"
include ":projectA:childA2"
include ":projectB"

:projectA:childA1表示childA1是projectA的子project,根目录对应的是rootProject。根据settings文件,最后创建的project树如下:

project树状结构

需要注意的是,project的树状关系一般是和目录结构保持一致的,也可以不一致。比如我们可以在settings中写

include “:projectA:projectB"

这样的话,projectB的父project就变成了projectA。如果这样写的话,会报错说找不到projectB,因为默认情况下Gradle会在projectA目录下面找。我们可以用下面这句话改变project的路径:

project(":projectA:projectB").projectDir = new File("projectB")

(2)Configuration-配置阶段

初始化阶段创建完了project,然后便会按照广度优先的顺序,针对每个project对象,执行其中的build.gradle脚本。
我们的例子中build.gradle的内容都一样,如下所示:

// build.gradle

println "configuration ${project.path}”

task("hello").doLast{
    println("hello from ${project.path}")
}

task("world").doLast {
    println("world from ${project.path}")
}

tasks.getByName("world").dependsOn("hello")

task(“hello")其实就是在调用:projectA:childA1这个project对象的task方法,这个project对象就是在前面的初始化阶段创建的。task方法的作用是用来在project中创建一个task,task的名字为hello。

这个脚本中一共创建了两个task,分别为hello和world。tasks是project中的一个字段,类型为TaskContainer。一个project 的所有task都会保存在这个TaskContainer中。接下来通过task的dependsOn方法,在hello和world之间创建了依赖关系。
所有的task会形成一个有向无环图。

println "configuration ${project.path}”, 这一句在该阶段就会执行,输出一条日志。
doLast是task的一个回调方法,该回调会在下面的执行阶段执行。

(3)Excution-执行阶段

配置完了就到了执行阶段,我们要执行的是projectA:childA1下的world task。gradle会根据task的依赖关系图,从前往后执行。本例中的world task依赖于hello task,而hello不依赖与任何的task,所以先执行hello,然后再执行world。这两个task都属于同一个project,我们也可以在不同project的task之间建立依赖关系。比如:

tasks.getByName("world").dependsOn(“:projectB:hello")

task有doFirst和doLast两个关键方法,它们可以在task执行前后追加命令,构成了两个链表。比如:

tasks.getByName("world").doFirst {
    println "first 1"
}

tasks.getByName("world").doFirst {
    println "first 2"
}

tasks.getByName("world").doLast {
    println "last 1"
}

tasks.getByName("world").doLast {
    println "last 2"
}

最后的输出是

first2
first1
last1
last2

注意是first2在first1之前执行

  1. 输出结果

我们最初的例子的输出结果如下

输出结果

从输出的结果里面可以验证Gradle生命周期的三个阶段。

参考资料:

Gradle的官网是最好的资料,建议有英文阅读能力的直接看官网
Gradle用户手册:https://docs.gradle.org/current/userguide/userguide.html
Gradle Build Lifecycle: https://docs.gradle.org/current/userguide/build_lifecycle.html#build_lifecycle_events

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容