写在前面的话,最近在系统的学习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在三个阶段评估和执行构建脚本是很重要的:

  1. 初始化
    创建构建环境并确定哪些项目参与构建
  2. 配置
    为构建构造和配置任务图,根据用户想要运行的任务确定以何种顺序执行哪些任务。
  3. 执行
    运行配置阶段结束时选择的任务。

这些阶段就构成了 Gradle 的生命周期。

与Apache Maven术语的比较:
Gradle的构建阶段不像Maven的阶段。Maven的构建阶段将构建分为多个阶段。它们的作用类似于 Gradle 的任务图,尽管不那么灵活。
Maven的构建生命周期概念与Gradle的生命周期任务大致相似。

好的设计构建脚本主要由声明式配置而非命令逻辑组成。在配置阶段可以理解地评估该配置。即便如此,许多此类构建还具有任务操作 - 例如通过doLast {}和doFirst {}块 - 在执行阶段进行评估。这很重要,因为在配置阶段评估的代码不会看到在执行阶段发生的更改。

配置阶段另一个重要的方面是每次构建都会对其中涉及的所有内容做评估。这也是为什么应该在配置阶段避免多余的工作。构建扫描可以帮助你识别这样的事情。

Gradle 的扩展方式

如果Gradle 附带的构建逻辑无法满足我们的构建需求,而往往通常是这样。大部分的构建都有特定的需求,需要我们添加自己的构建逻辑。

Gradle 提供了以下几个主要方式去扩展它。

  1. 自定义任务类型

    当 Gradle 本身的任务无法满足你的时候,你可以编写自己的任务类型。最好将编写的任务源文件放在 buildSrc 目录或者打包一个插件,然后你就可以像使用其他的Gradle 任务那样使用了。
    参考 https://docs.gradle.org/current/userguide/custom_tasks.html

  2. 自定义任务操作

    你可以将自己的构建逻辑附加在任务的 开始之前 Task.doFirst() 和 结束之后 Task.doLast() 的方法里。

  3. 项目和任务的额外属性

    Gradle 允许你为项目或者任务添加自己的属性,你可以在自定义行为或者其他构建逻辑中使用。额外的属性甚至可以应用于你没有显式创建的任务,比如由Gradle的核心插件创建的任务。

  4. 自定义约定

    约定是一种简化构建的强大方法,这样用户就可以更容易地理解和使用它们。这可以在使用标准项目结构和命名约定(如Java构建)的构建中看到。
    你可以编写自己的插件来提供约定——它们只需要为构建的相关方面配置默认值。

  5. 自定义模型

    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 是什么的更多相关文章

  1. Gradle配置APK自动签名完整流程

    转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...

  2. gradle学习笔记(1)

    1. 安装     (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site:     (2) 添加环境变量:             1) 变量名:GRADLE_HOM ...

  3. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  4. 解决 Could not find com.android.tools.build:gradle 问题

    今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...

  5. React Native Android gradle下载慢问题解决

    很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...

  6. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

  7. 对Maven、gradle、svn、spring 3.0 fragment、git的想法

    1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web  fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...

  8. 项目自动化建构工具gradle 入门1——输出helloWorld

    先来一个简单的例子,4个步骤: 1.进入D:\work\gradle\java 目录  ,您电脑没这目录? 那辛苦自己一级一级建立起来吧 新建文件build.gradle,文件内容是: apply p ...

  9. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  10. 通过Gradle为APK瘦身

    引言:在过去几年中,APK 文件的大小曾急剧增长态势.一般来说,其原因如下:Android开发者获取了更多的依赖库,添加了更多的密度,Apps 增加了更多的功能.但实际上我们应该让APKs 尽可能的小 ...

随机推荐

  1. ASP.NET--Web服务器端控件和Html控件

    今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但 ...

  2. python 面向对象编程 - 小游戏

    面向对象写的小游戏 欢迎玩耍 class Omnicience: camp = 'Omniscience' def __init__(self, name, atk=100, hp=1000, mp= ...

  3. [02] HEVD 内核漏洞之栈溢出

    作者:huity出处:http://www.cnblogs.com/huity35/版权:本文版权归作者所有.文章在看雪.博客园.个人博客同时发布.转载:欢迎转载,但未经作者同意,必须保留此段声明:必 ...

  4. Java 集合框架部分面试题

    1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1 ...

  5. 针对Nginx日志中出现的漏洞扫描与爬虫的三种措施

    0x001 使用fail2ban工具结合防火墙(iptables | firewalld),将大量404请求的IP地址封了.(详见fail2ban使用说明:https://www.cnblogs.co ...

  6. ThinkPHP 添加数据到数据库失败

    ThinkPHP 添加数据到数据库失败 一般情况下会先检查一下几个方面 检查控制器或Model名是否有误 检查需要插入的数据是否为空或者缺失参数 检查数据表名及字段名称(大部分下都是字段名有误出错的) ...

  7. linux初学者-系统启动故障篇

    linux初学者-系统启动故障篇 在系统的操作中,有时会不小心误删或者操作失误使得系统启动不起来,下文将列举几种常见的系统启动失败的情况及解决的办法. 1.删除或者覆盖mbr的446个字节 mbr的4 ...

  8. sqlserver清除日志

    在一次处理数据库日志已满的过程中,发现有的时候数据库日志不能清除,经实验,可以通过以下方式来完成. 使用exec sp_cycle_errorlog 来清除sql系统本身的临时日志. dump tra ...

  9. spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析

    spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...

  10. 《HelloGitHub》第 40 期

    <HelloGitHub>第 40 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...