Gradle教程系列 —— 构建生命周期

Gradle的核心是基于依赖的编程语言。这意味着我们可以定义任务和任务之间的依赖关系。Gradle保证这些任务按其依赖项的顺序执行,并且每个任务只执行一次。这些任务可以抽象成一个有向无环图。Gradle会在执行任务之前构建完整的依赖关系图。这就是Gradle的核心思想。

构建阶段

Gradle构建过程有三个阶段。

  • 初始化(Initialization)

Gradle可以构建一个和多个项目。在初始化阶段,Gradle会确定哪些项目参与构建,并且为这些项目创建一个Project实例。

  • 配置(Configuration)

在这个阶段,会配置project对象。将执行构建的所有项目的构建脚本。也就是说,会执行每个项目的build.gradle文件。

  • 执行(Execution)

Gradle确定要在执行期间创建和配置的任务子集。子集由传递给gradle命令和当前目录的任务名称参数确定。 Gradle然后执行每个选定的任务。

Settings文件

除了build.gradle 文件外,Gradle定义了一个settings文件。settings文件由Gradle通过命名约定确定。该文件默认明为settings.gradle

settings.gradle是在初始化阶段执行。构建多个项目时,必须在根目录中有settings.gradle文件。因为在这个文件中定义了哪些项目参加构建。在构建Android项目时,我们会在根目录找到settings.gradle文件。除了定义包含的项目之外,您可能还需要将库添加到构建脚本类路径中。下面我们举一个简单的例子。

settings.gradle

println 'This is executed during the initialization phase.'

build.gradle

println 'This is executed during the configuration phase.'

task configured {
    println 'This is also executed during the configuration phase.'
}

task test {
    doLast {
        println 'This is executed during the execution phase.'
    }
}

task testBoth {
    doFirst {
      println 'This is executed first during the execution phase.'
    }
    doLast {
      println 'This is executed last during the execution phase.'
    }
    println 'This is executed during the configuration phase as well.'
}

运行结果

$ gradle test testBoth
This is executed during the initialization phase.
This is executed during the configuration phase.
This is also executed during the configuration phase.
This is executed during the configuration phase as well.
:test
This is executed during the execution phase.
:testBoth
This is executed first during the execution phase.
This is executed last during the execution phase.

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed

对于构建脚本,属性访问和方法调用将委派给project对象。类似地,settings文件中的属性访问和方法调用被委托给setting对象.

构建多项目

响应构建脚本中的生命周期

随着构建在其生命周期中的进展,我们的构建脚本可以接收通知。这些通知通常采用两种形式:我们可以实现特定的监听器接口,也可以在触发通知时提供执行闭包。下面的例子使用闭包。

项目评估(project evaluation)

您可以在评估项目之前和之后立即收到通知。

将测试任务添加到具有特定属性集的每个项目

allprojects {
    afterEvaluate { project ->
        if (project.hasTests) {
            println "Adding test task to $project"
            project.task('test2') {
                doLast {
                    println "Running tests for $project"
                }
            }
        }
    }
}

allprojects {  

    ext.hasTests = true
}

输出结果

$ gradle -q test2
Adding test task to root project 'gradle lifecycle'
Running tests for root project 'gradle lifecycle'

总结

Gradle的构建生命周期分为初始化,配置,执行三个阶段。初始化阶段主要是读取settings.gradle 文件,用于确定哪些项目参与构建,并创建Project实例;而配置阶段主要是为每个build.gradle 文件配置project对象;执行阶段主要是根据gradle命令和传入的参数创建并执行任务。关于Project和Task的概念,我在下一篇文章中会介绍。

推荐阅读更多精彩内容

  • 说明 本文主要从实现原理和代码层面介绍Gradle开发相关知识。关于本文中提到的、Gradle中的基本概念等内容,...
    jzj1993阅读 7,052评论 1 33
  • 构建的生命周期 Gradle项目的构建分为三个阶段:初始化、配置、执行。参考官方手册 Build Lifecycl...
    十思叶阅读 2,661评论 1 6
  • 对于初学者来说,面对各种各样的Gradle构建脚本,想要梳理它的构建流程,往往不知道从何入手。Gradle的构建过...
    Joe_H阅读 9,608评论 2 50
  • 2010至今,做过工作:缝纫工(服装),实体店卖女鞋,电子商务淘宝客服、电子商务运营助理职位,也未找到自己方向,...
    Audrey1阅读 110评论 0 1
  • 未曾谋面的 似曾谋面的 女 神 已然熟悉的 画 文 字 收藏在心底 祝女神们快乐健康幸福平安!
    一帘幽幽梦阅读 100评论 0 4
  • 看了苏江的一篇文章,写得还是不错的。牛市里,人们的积极情绪会被放大,会觉得区块链技术无所不能,牛逼闪闪;在熊市里,...
    牛小静阅读 148评论 0 0