Gradle学习-3 Gradle构建的生命周期

Gradle常用文件目录
在这里插入图片描述

Gradle 构建的生命周期,有3个阶段:

  • 初始化阶段
  • 配置阶段
  • 执行阶段

1、初始化阶段

  • Gradle 支持构建单个工程个多个子工程,初始化阶段主要负责收集所有参与本次构建的子工程,创建一个项目的层次结构,并未每个项目创建一个 project 实例。与该阶段关系最大的就是根目录下的 setting.gradle 文件。

可以在 setting.gradle中添加Gradle构建生命周期监听

setting.gradle

println("[Gradle生命周期] - 我是 setting.gradle")

//Gradle构建生命周期监听
gradle.addBuildListener(new BuildAdapter() {


    @Override
    void settingsEvaluated(Settings settings) {
        super.settingsEvaluated(settings)
        println("[Gradle生命周期] - 初始化阶段完成")
    }

    @Override
    void projectsEvaluated(Gradle gradle) {
        super.projectsEvaluated(gradle)
        println("[Gradle生命周期] - 配置阶段完成")
    }

    @Override
    void buildFinished(BuildResult result) {
        super.buildFinished(result)
        println("[Gradle生命周期] - 构建结束")
    }
})

执行效果
在这里插入图片描述

从执行结果可以看出,初始化阶段主要是执行 setting.gradle 文件。

2、配置阶段

  • 配置阶段主要是执行各个目录下的 build.gradle 文件,并且根据项目的配置去构建一个任务依赖的关系图,以便在执行阶段执行

在根目录的build.gradle文件末尾添加

println("[Gradle生命周期] - 我是根目录build.gradle")

在app目录的build.gradle文件末尾添加

println("[Gradle生命周期] - 我是app目录build.gradle")

执行结果

在这里插入图片描述
可以看到,初始化完成之后,便依次执行各个目录中的build.gradle

3、执行阶段

  • 主要负责把配置阶段生成的 任务依赖图 依次去执行

在 app 目录的 build.gradle 末尾添加

println("[Gradle生命周期] - 我是app目录build.gradle")

task testTask(){
    doLast {
        println("[Gradle生命周期] - 我是app目录build.gradle中的testTask")
    }
}

执行命令

./gradlew :app:testTask -q

执行结果

在这里插入图片描述

可以看到,配置阶段完成后,便开始执行 task

4、Gradle构建过程中,几个重要角色

阶段角色
初始化阶段rootProject
配置阶段project
执行阶段task
  • 初始化阶段,主要是执行 setting.gradle,可以在setting.gradle中拿到 rootProject,并且之后的阶段都可以使用 rootProject
  • 配置阶段,就可以拿到所有子工程的project实例了
  • 执行阶段,task是Gradle构建中执行的最小单元,我们所有的构建、编译、打包,都是有一个个task组成的,一个project中可以有多个task,task之间还可以相互依赖的

在setting.gradle中添加

println("[Gradle生命周期] - 我是 setting.gradle")
//初始化阶段可以拿到 rootProject
println("[Gradle生命周期] - rootProject路径:${rootProject.projectDir}")

//Gradle构建生命周期监听
gradle.addBuildListener(new BuildAdapter() {


    @Override
    void settingsEvaluated(Settings settings) {
        super.settingsEvaluated(settings)
        println("[Gradle生命周期] - 初始化阶段完成")
    }

    @Override
    void projectsEvaluated(Gradle gradle) {
        super.projectsEvaluated(gradle)
        println("[Gradle生命周期] - 配置阶段完成")
        //配置阶段可以拿到project
        gradle.rootProject.childProjects.each {name, pro->
            println("[Gradle生命周期] - 子工程{ 名称:$name    路径:${pro.projectDir} }")
        }
    }

    @Override
    void buildFinished(BuildResult result) {
        super.buildFinished(result)
        println("[Gradle生命周期] - 构建结束")
    }
})

在app目录下的build.gradle添加

println("[Gradle生命周期] - 我是app目录build.gradle")
//配置阶段可以拿到project
println("[Gradle生命周期] - {  工程名:${project.name}   工程路径:${project.projectDir}  }")
//project可以拿到很多参数,如父工程,任务等,可以点击查看源码
println("[Gradle生命周期] - {  父工程:${project.parent.name}   父工程路径:${project.parent.projectDir}  }")
project.tasks.each {
    println("[Gradle生命周期] - app子工程中的任务:{  任务名:${it.name}   任务路径:${it.path}")
}

在根目录子的build.gradle添加

println("[Gradle生命周期] - 我是根目录build.gradle")
//配置阶段可以拿到project
println("[Gradle生命周期] - {  工程名:${project.name}   工程路径:${project.projectDir}  }")
//project可以拿到很多参数,如任务等,可以点击查看源码
project.tasks.each {
    println("[Gradle生命周期] - 根目录工程中的任务:{  任务名:${it.name}   任务路径:${it.path}")
}

执行结果
在这里插入图片描述

在这里插入图片描述

补充:创建任务

在 app目录的build.gradle中添加

task testTask1() {
    doLast {
        println("[Gradle生命周期] - 我是app目录build.gradle中的testTask1")
    }
}

task testTask2() {
    //testTask2依赖testTask1
    dependsOn testTask1
    doLast {
        println("[Gradle生命周期] - 我是app目录build.gradle中的testTask2")
    }
}

执行命令

./gradlew :app:testTask2 -q

执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/746882.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”

近日,极限数据(北京)科技有限公司(简称:极限科技)新获得一项国家发明专利授权,专利名为 “搜索数据库的正排索引处理方法、装置、介质和设备”,专利号:ZL 2024 1 0479400…

实用软件下载:BetterZip 5最新安装包及详细安装教程

​我们都知道BetterZip是Mac平台上非常受欢迎的文件“解/压缩”工具之一,并且能够生成被Win支持的压缩包。不同领域的应用证明了这是一款功能强大的 Mac 解压缩软件支持 RAR、ZIP等30 种档案格式,可创建小型应用软件。值得一提的是而且能够在不必解压的情…

【教学类-64-05】20240625彩棒鱼骨图(二)AB排列 6.5*1CM 6选2根 30种

背景需求: 【教学类-64-04】20240619彩棒鱼骨图(一)6.5*1CM 6根棒子720种-CSDN博客文章浏览阅读897次,点赞23次,收藏13次。【教学类-64-04】20240619彩棒鱼骨图(一)6.5*1CM 6根棒子720种https:…

WordPress强大多功能主题模板The7 v9.16.0

模板介绍 The7可以与WPBakery Page Builder(原Visual Composer)和Ultimate Addons的完全无缝集成。它也与大多数流行的插件完全兼容,例如WooCommerce,WPML,Yoast SEO,All in One WP Migration,…

视觉分割的定义与性能度量

文章目录 视觉分割的定义语义分割(Semantic Segmentation)实例分割(instance Segmentation)全景分割(Panoptic Segmentation)视频语义分割(Video Semantic Segmentation)视频实例分割(Video instance Segmentation)视频全景分割(Video Panoptic Segmentation)各任务对比 视觉分…

classnames.js 优化类名的工具库

classnames.js 是什么? classnames.js 是一个简单的类名控制工具库,可以方便的通过条件动态控制class类名的显示。 官方代码及示例文档参见:GitHub - JedWatson/classnames: A simple javascript utility for conditionally joining classNames together 为什么要使用 clas…

Linux扩展lvm分区实践 -- 使用其他磁盘的空间

如图,根分区900G,计划将另一块磁盘sdb分出1T来给根分区 步骤 1:创建新的分区 sudo fdisk /dev/sdb输入 n 创建一个新分区 然后选择分区类型,输入p 设置起始扇区(默认),然后设置分区大小&…

服务器部署与DDOS攻防

知识点:DHPC与Web服务部署,DHCPig攻防,SYN Flooding测试 DHCP: 能够自动为客户机获取IP等参数 DHCP是动态主机配置协议(Dynamic Host Configuration Protocol)的缩写,它是一种网络管理协议&am…

633. 平方数之和(中等)

633. 平方数之和 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java内存溢出溢出代码正确代码与截图 1. 题目描述 题目中转:633. 平方数之和 2.详细题解 本题是167. 两数之和 II - 输入有序数组(中等)题目的变型,由两数之和变…

PS系统教程30

图层蒙版组合使用 案例介绍 全选背景图-复制背景图粘贴背景图CtrlI反选背景色填充黑色快速选区工具框柱需要素材画笔涂抹白色 步骤截图 1-3 4-5 图层蒙版与渐变工具结合使用 案例2 注意 使用PS的渐变工具覆盖全部的原因可能包括操作不当或设置错误。 操作不当&#xff1…

docker入门配置

1、创建配置镜像 由于国内docker连接外网速度慢,采用代理 vi /etc/docker/daemon.json添加以下内容 {"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com","https://dockerproxy.com","https://hub-mirror.c.163.co…

Opencv中RotatedRect和ellipse的角度方向

版本:opencv-4.7.0-windows Opencv中,大多数时候,逆时针旋转是正方向,但在RotatedRect和ellipse中,顺时针旋转是正方向。 //RotatedRect的角度参数是顺时针为正方向 RotatedRect(const Point2f& center, const Si…

鸿蒙开发Ability Kit(程序框架服务):【FA模型切换Stage模型指导】 app和deviceConfig的切换

app和deviceConfig的切换 为了便于开发者维护应用级别的属性配置,Stage模型将config.json中的app和deviceConfig标签提取到了app.json5中进行配置,并对部分标签名称进行了修改,具体差异见下表。 表1 配置文件app标签差异对比 配置项FA模型…

交通大数据分析与挖掘实训【对提供的CSV格式数据使用pandas库分析-Matplotlib库绘图】

背景: 《交通大数据分析与挖掘》实训 指 导 书 编著 二○二四年五月 一、实训目的 1、掌握python开发环境(如Anaconda)及Numpy等常见第三方库的使用; 2、熟悉Anaconda在线编程平台,学会基本的python程序编写…

企业邮箱客服响应速度哪家好?

在选择企业邮箱的过程中,有一个点很容易被忽略,那就是企业邮箱客服的响应速度。试想,若是出现了邮件发件问题,而不能及时解决处理,可能会给企业带来很大的经济损失。今天就来对比下国内外三款企业邮箱的客服响应速度。…

typescript学习回顾(三)

今天继续来分享ts的相关概念,枚举,ts模块化,接口和类型兼容性 ts的扩展类型:类型别名,枚举,接口和类 枚举 基础概念 枚举通常用于约束某个变量的取值范围。当然字面量和联合类型配合使用,也可…

电脑开机之后屏幕没有任何显示?怎么检查?

前言 最近有很多小伙伴来咨询,自己的电脑开机之后,屏幕真的是一点显示都没有,只有CPU风扇在转。 这个情况小白经常经常经常遇到,所以写一篇关于这个问题的排查教程。按照这个教程来排查,除非真的是硬件损坏&#xff…

武汉星起航:挂牌上海股权交易中心,自营店铺销售额迎飞跃式增长

2023年10月30日,对于武汉星起航电子商务有限公司而言,无疑是一个载入史册的重要日子。这一天,公司成功在上海股权托管交易中心挂牌展示,正式登陆资本市场,开启了全新的发展篇章。这一里程碑式的跨越,不仅彰…

从写下第1个脚本到年薪40W,我的测试开发心路历程!

对于任何职业来说,薪资始终都会是众多追求的重要部分。前几年测试行业还是风口,但是随着不断新鲜血液的加入,再加上就业大环境不好,企业也都在“降本增效”。目前内卷也是越来越激烈。不得不承认当下的现状,已经不仅仅…

构建家庭NAS之二:TrueNAS Scale规划、安装与配置

本系列文章索引: 构建家庭NAS之一:用途和软硬件选型 构建家庭NAS之二:TrueNAS Scale规划、安装与配置 构建家庭NAS之三:在TrueNAS SCALE上安装qBittorrent 首先声明一下,我用的版本是TrueNAS SCALE 24.04.1.1&#xf…