Gradle 介绍,根据 Gradle 官方文档整理

news2024/12/26 11:56:02

这部分内容主要根据 Gradle 官方文档整理,做了对应的删减,主要保留比较重要的部分,不涉及实战,主要是一些重要概念的介绍。

Gradle 这部分内容属于可选内容,可以根据自身需求决定是否学习,目前国内还是使用 Maven 普遍一些。

Gradle 介绍

Gradle 官方文档是这样介绍的 Gradle 的:

Gradle is an open-source build automation tool flexible enough to build almost any type of software. Gradle makes few assumptions about what you’re trying to build or how to build it. This makes Gradle particularly flexible.

Gradle 是一个开源的构建自动化工具,它足够灵活,可以构建几乎任何类型的软件。Gradle 对你要构建什么或者如何构建它做了很少的假设。这使得 Gradle 特别灵活。

简单来说,Gradle 就是一个运行在 JVM 上的自动化的项目构建工具,用来帮助我们自动构建项目。

对于开发者来说,Gradle 的主要作用主要有 3 个:

  1. 项目构建:提供标准的、跨平台的自动化项目构建方式。
  2. 依赖管理:方便快捷的管理项目依赖的资源(jar 包),避免资源间的版本冲突问题。
  3. 统一开发结构:提供标准的、统一的项目结构。

Gradle 构建脚本是使用 Groovy 或 Kotlin 语言编写的,表达能力非常强,也足够灵活。

Groovy 介绍

Gradle 是运行在 JVM 上的一个程序,它可以使用 Groovy 来编写构建脚本。

Groovy 是运行在 JVM 上的脚本语言,是基于 Java 扩展的动态语言,它的语法和 Java 非常的相似,可以使用 Java 的类库。Groovy 可以用于面向对象编程,也可以用作纯粹的脚本语言。在语言的设计上它吸纳了 Java、Python、Ruby 和 Smalltalk 语言的优秀特性,比如动态类型转换、闭包和元编程支持。

我们可以用学习 Java 的方式去学习 Groovy ,学习成本相对来说还是比较低的,即使开发过程中忘记 Groovy 语法,也可以用 Java 语法继续编码。

基于 JVM 的语言有很多种比如 Groovy,Kotlin,Java,Scala,他们最终都会编译生成 Java 字节码文件并在 JVM 上运行。

Gradle 优势

Gradle 是新一代的构建系统,具有高效和灵活等诸多优势,广泛用于 Java 开发。不仅 Android 将其作为官方构建系统, 越来越多的 Java 项目比如 Spring Boot 也慢慢迁移到 Gradle。

  • 在灵活性上,Gradle 支持基于 Groovy 语言编写脚本,侧重于构建过程的灵活性,适合于构建复杂度较高的项目,可以完成非常复杂的构建。
  • 在粒度性上,Gradle 构建的粒度细化到了每一个 task 之中。并且它所有的 Task 源码都是开源的,在我们掌握了这一整套打包流程后,我们就可以通过去修改它的 Task 去动态改变其执行流程。
  • 在扩展性上,Gradle 支持插件机制,所以我们可以复用这些插件,就如同复用库一样简单方便。

Gradle Wrapper 介绍

Gradle 官方文档是这样介绍的 Gradle Wrapper 的:

The recommended way to execute any Gradle build is with the help of the Gradle Wrapper (in short just “Wrapper”). The Wrapper is a script that invokes a declared version of Gradle, downloading it beforehand if necessary. As a result, developers can get up and running with a Gradle project quickly without having to follow manual installation processes saving your company time and money.

执行 Gradle 构建的推荐方法是借助 Gradle Wrapper(简而言之就是“Wrapper”)。Wrapper 它是一个脚本,调用了已经声明的 Gradle 版本,如果需要的话,可以预先下载它。因此,开发人员可以快速启动并运行 Gradle 项目,而不必遵循手动安装过程,从而为公司节省时间和金钱。

我们可以称 Gradle Wrapper 为 Gradle 包装器,它将 Gradle 再次包装,让所有的 Gradle 构建方法在 Gradle 包装器的帮助下运行。

Gradle Wrapper 的工作流程图如下(图源Gradle Wrapper 官方文档介绍):

整个流程主要分为下面 3 步:

  1. 首先当我们刚创建的时候,如果指定的版本没有被下载,就先会去 Gradle 的服务器中下载对应版本的压缩包;
  2. 下载完成后需要先进行解压缩并且执行批处理文件;
  3. 后续项目每次构建都会重用这个解压过的 Gradle 版本。

Gradle Wrapper 会给我们带来下面这些好处:

  1. 在给定的 Gradle 版本上标准化项目,从而实现更可靠和健壮的构建。
  2. 可以让我们的电脑中不安装 Gradle 环境也可以运行 Gradle 项目。
  3. 为不同的用户和执行环境(例如 IDE 或持续集成服务器)提供新的 Gradle 版本就像更改 Wrapper 定义一样简单。

生成 Gradle Wrapper

如果想要生成 Gradle Wrapper 的话,需要本地配置好 Gradle 环境变量。Gradle 中已经内置了内置了 Wrapper Task,在项目根目录执行执行gradle wrapper命令即可帮助我们生成 Gradle Wrapper。

执行命令 gradle wrapper 命令时可以指定一些参数来控制 wrapper 的生成。具体有如下两个配置参数:

  • --gradle-version 用于指定使用的 Gradle 的版本
  • --gradle-distribution-url 用于指定下载 Gradle 版本的 URL,该值的规则是 http://services.gradle.org/distributions/gradle-${gradleVersion}-bin.zip

执行gradle wrapper命令之后,Gradle Wrapper 就生成完成了,项目根目录中生成如下文件:

├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

每个文件的含义如下:

  • gradle-wrapper.jar:包含了 Gradle 运行时的逻辑代码。
  • gradle-wrapper.properties:定义了 Gradle 的版本号和 Gradle 运行时的行为属性。
  • gradlew:Linux 平台下,用于执行 Gralde 命令的包装器脚本。
  • gradlew.bat:Windows 平台下,用于执行 Gralde 命令的包装器脚本。

gradle-wrapper.properties 文件的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
  • distributionBase:Gradle 解包后存储的父目录。
  • distributionPathdistributionBase指定目录的子目录。distributionBase+distributionPath就是 Gradle 解包后的存放的具体目录。
  • distributionUrl:Gradle 指定版本的压缩包下载地址。
  • zipStoreBase:Gradle 压缩包下载后存储父目录。
  • zipStorePathzipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是 Gradle 压缩包的存放位置。

更新 Gradle Wrapper

更新 Gradle Wrapper 有 2 种方式:

  1. 接修改distributionUrl字段,然后执行 Gradle 命令。
  2. 执行 gradlew 命令gradlew wrapper –-gradle-version [version]

下面的命令会将 Gradle 版本升级为 7.6。

gradlew wrapper --gradle-version 7.6

gradle-wrapper.properties 文件中的 distributionUrl 属性也发生了改变。

distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip

自定义 Gradle Wrapper

Gradle 已经内置了 Wrapper Task,因此构建 Gradle Wrapper 会生成 Gradle Wrapper 的属性文件,这个属性文件可以通过自定义 Wrapper Task 来设置。比如我们想要修改要下载的 Gralde 版本为 7.6,可以这么设置:

task wrapper(type: Wrapper) {
    gradleVersion = '7.6'
}

也可以设置 Gradle 发行版压缩包的下载地址和 Gradle 解包后的本地存储路径等配置。

task wrapper(type: Wrapper) {
    gradleVersion = '7.6'
    distributionUrl = '../../gradle-7.6-bin.zip'
    distributionPath=wrapper/dists
}

distributionUrl 属性可以设置为本地的项目目录,你也可以设置为网络地址。

Gradle 任务

在 Gradle 中,任务(Task)是构建执行的单个工作单元。

Gradle 的构建是基于 Task 进行的,当你运行项目的时候,实际就是在执行了一系列的 Task 比如编译 Java 源码的 Task、生成 jar 文件的 Task。

Task 的声明方式如下(还有其他几种声明方式):

// 声明一个名字为 helloTask 的 Task
task helloTask{
     doLast{
       println "Hello"
     }
}

创建一个 Task 后,可以根据需要给 Task 添加不同的 Action,上面的“doLast”就是给队列尾增加一个 Action。

 //在Action 队列头部添加Action
 Task doFirst(Action<? super Task> action);
 Task doFirst(Closure action);

 //在Action 队列尾部添加Action
 Task doLast(Action<? super Task> action);
 Task doLast(Closure action);

 //删除所有的Action
 Task deleteAllActions();

一个 Task 中可以有多个 Acton,从队列头部开始向队列尾部执行 Acton。

Action 代表的是一个个函数、方法,每个 Task 都是一堆 Action 按序组成的执行图。

Task 声明依赖的关键字是dependsOn,支持声明一个或多个依赖:

task first {
 doLast {
        println "+++++first+++++"
    }
}
task second {
 doLast {
        println "+++++second+++++"
    }
}

// 指定多个 task 依赖
task print(dependsOn :[second,first]) {
 doLast {
      logger.quiet "指定多个task依赖"
    }
}

// 指定一个 task 依赖
task third(dependsOn : print) {
 doLast {
      println '+++++third+++++'
    }
}

执行 Task 之前,会先执行它的依赖 Task。

我们还可以设置默认 Task,脚本中我们不调用默认 Task ,也会执行。

defaultTasks 'clean', 'run'

task clean {
    doLast {
        println 'Default Cleaning!'
    }
}

task run {
    doLast {
        println 'Default Running!'
    }
}

Gradle 本身也内置了很多 Task 比如 copy(复制文件)、delete(删除文件)。

task deleteFile(type: Delete) {
    delete "C:\\Users\\guide\\Desktop\\test"
}

Gradle 插件

Gradle 提供的是一套核心的构建机制,而 Gradle 插件则是运行在这套机制上的一些具体构建逻辑,其本质上和 .gradle 文件是相同。你可以将 Gradle 插件看作是封装了一系列 Task 并执行的工具。

Gradle 插件主要分为两类:

  • 脚本插件:脚本插件就是一个普通的脚本文件,它可以被导入都其他构建脚本中。
  • 二进制插件 / 对象插件:在一个单独的插件模块中定义,其他模块通过 Plugin ID 应用插件。因为这种方式发布和复用更加友好,我们一般接触到的 Gradle 插件都是指二进制插件的形式。

虽然 Gradle 插件与 .gradle 文件本质上没有区别,.gradle 文件也能实现 Gradle 插件类似的功能。但是,Gradle 插件使用了独立模块封装构建逻辑,无论是从开发开始使用来看,Gradle 插件的整体体验都更友好。

  • 逻辑复用: 将相同的逻辑提供给多个相似项目复用,减少重复维护类似逻辑开销。当然 .gradle 文件也能做到逻辑复用,但 Gradle 插件的封装性更好;
  • 组件发布: 可以将插件发布到 Maven 仓库进行管理,其他项目可以使用插件 ID 依赖。当然 .gradle 文件也可以放到一个远程路径被其他项目引用;
  • 构建配置: Gradle 插件可以声明插件扩展来暴露可配置的属性,提供定制化能力。当然 .gradle 文件也可以做到,但实现会麻烦些。

Gradle 构建生命周期

Gradle 构建的生命周期有三个阶段:初始化阶段,配置阶段运行阶段

在初始化阶段与配置阶段之间、配置阶段结束之后、执行阶段结束之后,我们都可以加一些定制化的 Hook。

初始化阶段

Gradle 支持单项目和多项目构建。在初始化阶段,Gradle 确定哪些项目将参与构建,并为每个项目创建一个 Project 实例 。本质上也就是执行 settings.gradle 脚本,从而读取整个项目中有多少个 Project 实例。

配置阶段

在配置阶段,Gradle 会解析每个工程的 build.gradle 文件,创建要执行的任务子集和确定各种任务之间的关系,以供执行阶段按照顺序执行,并对任务的做一些初始化配置。

每个 build.gradle 对应一个 Project 对象,配置阶段执行的代码包括 build.gradle 中的各种语句、闭包以及 Task 中的配置语句。

在配置阶段结束后,Gradle 会根据 Task 的依赖关系会创建一个 有向无环图

运行阶段

在运行阶段,Gradle 根据配置阶段创建和配置的要执行的任务子集,执行任务。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回调函数与钩子函数的区别,另QT中connect函数的实现,lambda的使用

1、钩子函数是回调函数的一种 广泛来说两者都是一样的 严格来说 钩子函数的函数名早已被定义好&#xff0c;只是函数内部需要用户在应用层来定义&#xff0c; 1&#xff09;可以完全通过宏来实现系统是否调用该函数&#xff08;底层不封闭&#xff0c;修改宏的参数实现是否编…

chatgpt赋能python:Python动态分配内存:了解它的工作原理

Python动态分配内存&#xff1a;了解它的工作原理 Python是一种高级编程语言&#xff0c;它在处理内存和垃圾回收方面具有独特的方式。在Python中&#xff0c;内存分配和释放是动态的&#xff0c;并且由解释器自动完成。这意味着&#xff0c;Python程序员无需手动管理内存&…

C/C++/Qt 文件操作 效率比较

C/C/Qt 文件操作 & 效率比较 1 介绍2 比较结果2.1 Linux平台上运行程序普遍比Windows上快&#xff1b;Windows下VC编译的程序一般运行比MINGW&#xff08;MINimal Gcc for Windows&#xff09;快2.2 二进制文件的操作要快于文本文件&#xff1b;写文件的操作要快于读文件&a…

chatgpt赋能python:Python剔除函数的使用介绍

Python剔除函数的使用介绍 在Python编程中&#xff0c;剔除函数是非常有用的工具&#xff0c;它可以帮助程序员快速筛选出不符合条件的数据。本文将介绍剔除函数的概念和常见用法&#xff0c;以及如何有效使用剔除函数解决实际问题。 剔除函数的概念 剔除函数是指Python中的…

反射相关知识点

这里写目录标题 反射概述获取Class对象的三种方式总结具体代码演示 获取构造方法以及构造方法里的信息利用Class对象调用对应方法&#xff0c;以及用调取出来的Constructor&#xff08;构造器类&#xff09;创建对象具体代码 获取成员变量利用Class对象调用对应方法&#xff0c…

chatgpt赋能python:Python加速读取CSV文件的方法

Python加速读取CSV文件的方法 介绍 CSV文件是一种常见的数据格式&#xff0c;因为其简单和易于理解&#xff0c;被广泛应用于数据处理和数据分析。然而&#xff0c;在处理大型CSV文件时&#xff0c;读取速度会成为问题。Python作为一种高级编程语言&#xff0c;具有易学易用的…

AI+是企业管理软件的下一站和终点站

作为GPT综合症的表现&#xff0c;准备陆续写一点关于AI的文章。就从这一篇开始吧。 这篇文章原来是在2019年1月份我发在新浪微博和LinkedIn上的。刚搜了一下&#xff0c;全然不见了踪影。原因大家也都知道。但是&#xff0c;我想那个思想的小火花一定还在&#xff0c;在某处酝…

Jenkins概念及安装配置教程(三)

如何配置Jenkins&#xff1f; Jenkins 中的用户管理 要在 Jenkins 中管理用户&#xff0c;您应该导航到管理 Jenkins &#x1f86a; 配置全局安全。理想的选择是让 Jenkins 拥有自己的用户数据库。您可以创建一个只有读取权限的匿名用户。为您打算在下一步中添加的用户创建条…

【ARMv8 SIMD和浮点指令编程】NEON 加法指令——加法都能玩出花

向量加法包括常见的普通加指令&#xff0c;还包括长加、宽加、半加、饱和加、按对加、按对加并累加、选择高半部分结果加、全部元素加等。如果你和我一开始以为的只有一种普通加&#xff0c;那就太小看设计者了&#xff01;同时这么多加法指令的确会提升我们设计程序的效率&…

numpy包中的编码函数和解码函数numpy.char.encode() numpy.char.decode()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 numpy包中的编码函数和解码函数 numpy.char.encode() numpy.char.decode() [太阳]选择题 下列代码最后输出的结果是&#xff1f; import numpy as np x np.array([I, Love, Python]) print(…

Python jieba库

前言 Jieba库是优秀的中文分词第三方库&#xff0c;中文文本需要通过分词获得单个的词语。 Jieba库的分词原理&#xff1a;利用一个中文词库&#xff0c;确定汉字之间的关联概率&#xff0c;汉字间概率大的组成词组&#xff0c;形成分词结果。除了分词&#xff0c;用户还可以…

【数据库原理与应用 - 第八章】数据库的事务管理与并发控制

目录 一、事务管理 1、概念及特性 2、事务控制 &#xff08;1&#xff09;事务控制语句 显示事务举例 二、并发控制 1、问题引入 2、并发执行带来的问题 &#xff08;1&#xff09;丢失修改 &#xff08;2&#xff09;不可重复读 &#xff08;3&#xff09;读"…

[自学记录02|百人计划]纹理压缩

一、什么是纹理压缩 纹理压缩是为了解决内存、带宽问题&#xff0c;专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。 1.图片格式和纹理格式的区别 (1)图片格式 图片格式是图片文件的存储格式&#xff0c;通常在磁盘、内存中储存和传输文件时使用&#xff1b;例如…

单片机GD32F303RCT6 (Macos环境)开发 (三十三)—— 光照传感器 (BH1750)

GD32 光照传感器 BH1750的使用 1、GPIO模拟i2c配置 使用管脚为SCL PB10 SDA PB11&#xff0c;移植代码时可换自己的管脚。软件模拟i2c在十九章中讲过&#xff0c;与其不同的地方是&#xff0c;这里的us延时函数&#xff0c;换成了定时器3做us级的延时。 tim3的配置&#xf…

linux 找回root密码(CentOS7.6)

linux 找回root密码(CentOS7.6) 首先&#xff0c;启动系统&#xff0c;进入开机界面&#xff0c;在界面中按“e”进入编辑界面。如图 2. 进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以““Linux16”开头内容所在的行数”&#xff0c;在行的最后…

java-字符流和字节流(二)

java-字符流和字节流(二) 一、字节缓冲流 1.1字节缓冲流构造方法 字节缓冲流介绍 BufferOutputStream&#xff1a;该类实现缓冲输出流。 通过设置这样的输出流&#xff0c;应用程序可以向底层输出流写入字节&#xff0c;而不必为写入的每个字节导致底层系统的调用 BufferedIn…

chatgpt赋能python:Python动图如何优化SEO?

Python动图如何优化SEO&#xff1f; Python是一种高级编程语言&#xff0c;广泛应用于数据分析、人工智能和网站开发等领域。Python还支持创建动态图像&#xff0c;这些动态图像通常用于数据可视化、演示和教育目的。在本文中&#xff0c;我们将探讨如何使用Python创建动态图像…

chatgpt赋能python:Python加f之SEO的重要性

Python加f之SEO的重要性 随着互联网的不断发展和普及&#xff0c;越来越多的企业和个人纷纷进入到了网站建设&#xff0c;网络营销的大军之中。而SEO作为重要的一环&#xff0c;在各个领域内也变得愈加重要。而Python中的f字符串是近些年来引起广泛关注的一种新的字符串格式化…

chatgpt赋能python:Python动态内存分配:如何优化你的代码

Python动态内存分配&#xff1a;如何优化你的代码 在编写Python代码时&#xff0c;你可能已经注意到内存使用方面的一些问题。Python动态内存分配是一个重要的话题&#xff0c;它涉及到Python程序如何在运行时使用内存。本文将向您介绍Python动态内存分配的基本概念和如何优化…

chatgpt赋能python:Python动态代码在SEO中的重要性

Python动态代码在SEO中的重要性 Python是一种非常流行的编程语言&#xff0c;用于开发Web应用程序、数据分析、人工智能和机器学习。Python的动态代码能够动态生成HTML、CSS和JavaScript来创建动态网页。这种能力使Python在SEO中非常有用&#xff0c;因为它可以帮助网站排名更…