Gradle 是什么
写在前面的话,最近在系统的学习Gradle,本来想写一篇关于 Gradle 的介绍。
但在官网发现了这篇关于 Gradle 的介绍,已经介绍的很好了,我就很直接翻译过来了。
原文地址 https://docs.gradle.org/current/userguide/what_is_gradle.html
Gradle 是什么?
Gradle 是开源的自动化构建工具,它的设计足够灵活,可以构建几乎任何软件。
它有以下几个显著的优点:
高性能
Gradle 只运行那些输入和输出有改变的任务,从而避免无效的工作。另外,还可以通过缓存开关重用之前的任务输出(其他的机器上的缓存也是可以的)。
Gradle还实现了许多其他优化,开发团队会持续不断地改进Gradle的性能。
基于 JVM
Gradle 是运行在 JDK上的,必须安装 JDK 才能运行。因为是运行在 JDK 上,这对于使用 Java 的用户是个额外的好处,可以在构建脚本中使用标准的 Java API,例如 自定义任务和插件,另外,因为是基于JDK的,它可以很好的跨平台运行。
Gradle 并不限于构建JVM项目,甚至还附带了对于构建本地项目的支持。
约定
Gradle 借鉴 Mavean 的做法,通过实现约定,使常见类型的项目(比如Java项目)易于构建。使用适当的插件可以很容易的为许多项目生成构建脚本。
约定并没有什么限制,可以覆盖原有的约定,添加自定义任务等来实现自己的构建模型。
扩展性
Gradle有很好的扩展性,可以添加定义自己的任务,覆盖已有的任务类型甚至定义自己的构建模型。Android 支持插件就是个很好的例子,在原有的基础上 增加了 flavor 和 buildType 约定。
IDE 支持
常见的几个主流 IDE 都支持导入 Gradle项目,并可以与之交互,例如 Android studio,Eclipse , IntelliJ IDEA,NetBeans等。Gradle 也有将项目文件加载进 Visual studio 的解决方案。
Insight
构建扫描 提供了构建运行的大量信息,可以使用它去定位构建问题。它可以帮你定位构建性能问题。也可以把它分享给其他人,这样在交流问题的时候就很有用了。
更详细的构建扫描可以查看这个文档 https://scans.gradle.com/?_ga=2.3508848.1142716506.1563790305-874993899.1553652374
Gradle 的五个重要概念
Gradle 是一个灵活而强大的工具,在刚使用的时候很容易望而生畏。理解下面几个核心原则后就会觉得Gradle还是很好理解的,这会帮助你更好的使用Gradle。
Gradle 是一个通用构建工具
因为Gradle 不对要做的构建或者如何构建做任何设想,所以Gradle几乎可以构建任务软件。
目前最大的限制就是依赖管理只支持 Maven 和 lvy 的编译库和文件。
虽然有这样的限制,但是在用的时候也不麻烦,对常见类型的项目都是很容易构建的-例如 Java编译库,通过添加一层约定和插件预构建功能,可以将自己的约定和功能封装成一个插件,当然也可以发布这个插件。
Gradle 的核心是基于任务
Gradle 将其构建建模为任务(工作单元)的有向无环图。意思是构建实际上是配置一组任务,并根据他们的依赖性创建一个有向无环图。一旦图创建完成,Gradle 将确定哪些任务以何种顺序运行,然后执行它们。
下面是两个任务图,一个是简单的,一个是很详细的,任务的依赖关系通过箭头表示。
几乎所有的构建过程都可以建模为任务图,这也是Gradle如此灵活的原因之一。任务图可以通过插件和你自己的脚本定义,关于任务依赖性 可以看 文档 https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:task_dependencies
任务由三部分构成
- 操作 ——做一些工作,例如复制文件或者编译源码
- 输入 ——值,行为能够操作的值,文件或者目录。
- 输出 ——行为修改或产生的值,文件或目录
实际上根据现实情况以上都是可选的,例如在Gradle 的生命周期里任务就有的什么也没做,只是将多个任务组合起来。
另外 Gradle 的增量编译是很强大可靠的,为了快速编译除非真的需要执行 clean 任务之外没必要执行clean操作。
你可以选择运行哪些任务。通过指定执行所需任务来节省时间,但也仅此而已。如果你想运行单元测试,就应该执行 test任务。如果您想打包应用程序,大多数构建都有相应的组装任务。
最后一件事:Gradle的增量构建支持是健壮和可靠的,所以除非您真的想执行一个clean任务,否则通过避免 clean 任务来保持构建的快速运行
Gradle有几个固定的构建阶段
理解Gradle在三个阶段评估和执行构建脚本是很重要的:
- 初始化
创建构建环境并确定哪些项目参与构建 - 配置
为构建构造和配置任务图,根据用户想要运行的任务确定以何种顺序执行哪些任务。 - 执行
运行配置阶段结束时选择的任务。
这些阶段就构成了 Gradle 的生命周期。
与Apache Maven术语的比较:
Gradle的构建阶段不像Maven的阶段。Maven的构建阶段将构建分为多个阶段。它们的作用类似于 Gradle 的任务图,尽管不那么灵活。
Maven的构建生命周期概念与Gradle的生命周期任务大致相似。
好的设计构建脚本主要由声明式配置而非命令逻辑组成。在配置阶段可以理解地评估该配置。即便如此,许多此类构建还具有任务操作 - 例如通过doLast {}和doFirst {}块 - 在执行阶段进行评估。这很重要,因为在配置阶段评估的代码不会看到在执行阶段发生的更改。
配置阶段另一个重要的方面是每次构建都会对其中涉及的所有内容做评估。这也是为什么应该在配置阶段避免多余的工作。构建扫描可以帮助你识别这样的事情。
Gradle 的扩展方式
如果Gradle 附带的构建逻辑无法满足我们的构建需求,而往往通常是这样。大部分的构建都有特定的需求,需要我们添加自己的构建逻辑。
Gradle 提供了以下几个主要方式去扩展它。
自定义任务类型
当 Gradle 本身的任务无法满足你的时候,你可以编写自己的任务类型。最好将编写的任务源文件放在 buildSrc 目录或者打包一个插件,然后你就可以像使用其他的Gradle 任务那样使用了。
参考 https://docs.gradle.org/current/userguide/custom_tasks.html自定义任务操作
你可以将自己的构建逻辑附加在任务的 开始之前 Task.doFirst() 和 结束之后 Task.doLast() 的方法里。
项目和任务的额外属性
Gradle 允许你为项目或者任务添加自己的属性,你可以在自定义行为或者其他构建逻辑中使用。额外的属性甚至可以应用于你没有显式创建的任务,比如由Gradle的核心插件创建的任务。
自定义约定
约定是一种简化构建的强大方法,这样用户就可以更容易地理解和使用它们。这可以在使用标准项目结构和命名约定(如Java构建)的构建中看到。
你可以编写自己的插件来提供约定——它们只需要为构建的相关方面配置默认值。自定义模型
Gradle允许你引进除任务,文件和依赖配置之外的概念。可以在大多数语言插件中看到这一点,它们将源集的概念添加到构建中。对构建过程进行适当的建模可以极大地提高构建的易用性和效率。
脚本对API进行操作
构建脚本其实就是可执行代码。好的脚本描述了构建软件需要哪些步骤,而不是这些步骤应该怎么工作。那是定制任务和插件应该做的。
有一个常见的误解是Gradle的强大和灵活是因为它的脚本是代码,其实并不是。提供这种的能力的是底层模型和API。就像我们在实践中建议的那样,你不应该放太多命令式逻辑在脚本里。然而,将构建脚本视为可执行代码有一个方面是有用的:理解构建脚本的语法如何映射到Gradle的API。由Groovy DSL引用和 Javadocs组成的API文档列出了方法和属性,并引用了闭包和操作。这些在构建脚本上下文中意味着什么? 查看Groovy构建脚本入门,了解这个问题的答案,以便能够有效地使用API文档。 https://docs.gradle.org/current/userguide/groovy_build_script_primer.html#groovy_build_script_primer
因为Gradle运行在 JVM上,所以脚本中也可以使用标准的Java API,Groovy 脚本可以使用 Groovy API,Kotlin 脚本可以使用 Kotlin API。
Gradle 是什么的更多相关文章
- Gradle配置APK自动签名完整流程
转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...
- gradle学习笔记(1)
1. 安装 (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site: (2) 添加环境变量: 1) 变量名:GRADLE_HOM ...
- Gradle 实现 Android 多渠道定制化打包
Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- React Native Android gradle下载慢问题解决
很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...
- Android studio使用gradle动态构建APP(不同的包,不同的icon、label)
最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...
- 对Maven、gradle、svn、spring 3.0 fragment、git的想法
1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...
- 项目自动化建构工具gradle 入门1——输出helloWorld
先来一个简单的例子,4个步骤: 1.进入D:\work\gradle\java 目录 ,您电脑没这目录? 那辛苦自己一级一级建立起来吧 新建文件build.gradle,文件内容是: apply p ...
- 用IntelliJ IDEA创建Gradle项目简单入门
Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...
- 通过Gradle为APK瘦身
引言:在过去几年中,APK 文件的大小曾急剧增长态势.一般来说,其原因如下:Android开发者获取了更多的依赖库,添加了更多的密度,Apps 增加了更多的功能.但实际上我们应该让APKs 尽可能的小 ...
随机推荐
- [记录]Python高并发编程
========== ==多进程== ========== 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fo ...
- 多个数据库 migration
More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerS ...
- Python学习1——Python中的 split() 函数
函数:split() Python中有split()和os.path.split()两个函数,此处简单介绍split()函数:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的 ...
- angularjs compine和link的区别
[译]ng指令中的compile与link函数解析 04 September 2014 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre ...
- SpringBoot2.1.6 + Shiro1.4.1 + Thymeleaf + Jpa整合练习
首先,添加maven依赖,完整的pom文件如下: <?xml version="1.0" encoding="UTF-8"?> <projec ...
- [NLP] 相对位置编码(一) Relative Position Representatitons (RPR) - Transformer
对于Transformer模型的positional encoding,最初在Attention is all you need的文章中提出的是进行绝对位置编码,之后Shaw在2018年的文章中提出了 ...
- Go语言圣经习题练习_1.7. Web服务
练习 1.12: 修改Lissajour服务,从URL读取变量,比如你可以访问 http://localhost:8000/?cycles=20 这个URL,这样访问可以将程序里的cycles默认的5 ...
- 林大妈的JavaScript基础知识(二):编写JavaScript代码前的一些简单工作
在介绍JavaScript语法前,我们需要知道,学习语法必须要多利用手敲代码来巩固记忆.因此,由于JavaScript的特性,它不能像C++和Java一样独立地编译及运行,我们需要在调试运行JavaS ...
- kuberenetes CRD开发指南
扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发. kubernetes允许用户自定义自己的资源对象,就 ...
- apache安装zip包安装(非exe)
安装步骤如下: (1) 下载apache安装程序 进入官网:选择一个版本的apache 选择红色区域的内容,在之后进入的页面中: 选择红色区域的内容,进入页面: 现则VC9的进行下载. (2) 安装 ...