第 3 章 · 核心概念:Project / Task / Plugin / 生命周期

4 个交互式演示帮你深刻理解 Gradle 最关键的概念。看懂这些,你就 Gradle 半个内行了。

🎬 生命周期演示:哪行代码在哪个阶段执行?

下面这段 build.gradle.kts 共 9 行代码。点击"▶ 跑 ./gradlew foo"按钮,观察每行在哪个阶段执行(绿色 = 配置阶段,黄色 = 执行阶段)。

🚦 当前阶段

Initialization
读 settings.gradle.kts
Configuration
执行所有 build 脚本,构造 Task DAG
Execution
按 DAG 跑 Task 的动作

📜 build.gradle.kts

println("[1] 顶层 println")tasks.register("foo") { println("[2] register 闭包里 println") doFirst { println("[3] doFirst") } doLast { println("[4] doLast") }}println("[5] 末尾 println")

📺 控制台输出

点击上方按钮开始模拟...

💡 关键观察:
- 跑 ./gradlew tasks 时,register 闭包里的 println 也会跑(因为配置阶段总会执行)
- 但 doFirst / doLast 的 println 不会跑(因为没真正执行 foo)
- 这就是"配置阶段一定跑、执行阶段按需跑"

🌐 Task DAG:./gradlew build 是怎么编排出来的

Gradle 在配置阶段把所有 Task 的 dependsOn 关系组合成一个有向无环图。点击下方按钮模拟从某个目标 Task 反向追踪 + 拓扑序执行。

💡 关键观察:
- 跑 build 触发整个图;跑 test 只触发左半边;跑 jar 只触发右半边
- 节点变黄表示正在执行;变绿表示完成
- 没有依赖关系的兄弟 Task(如 compileJava 和 compileTestJava)可以并行执行

🔗 doFirst/doLast 动作链表:理解执行顺序

每个 Task 维护一个动作链表。doFirst 把动作加到链表头(多个 doFirst 倒序),doLast 加到链表尾(多个 doLast 顺序)。

📋 当前动作链表(按执行顺序排列)

还没有动作。点上面 + doFirst / + doLast 添加。

📜 等价代码

tasks.register("demo") { // 当前没有动作 }

💡 试试:
- 加 3 个 doFirst(A、B、C),观察执行顺序:C → B → A(后加的先执行,因为 doFirst 是"插到队头")
- 加 3 个 doLast(X、Y、Z),观察执行顺序:X → Y → Z(按添加顺序)

🔌 Plugin 解构:一个 plugin 给你装了什么

选择一个常见插件,看看它实际给项目注入了哪些 Task / Configuration / 约定。

👈 选一个插件查看详细信息