build tool
Build tool(构建工具)
what:
构建工具能够帮助你创建一个可重复的、可靠的、携带的且不需要手动干预的构建。构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。
理解构建工具中组建的交互、构建逻辑和实际定义,以及输入输出的数据是非常重要的。
构建文件
构建文件包含了构建所需的配置信息、定义外部依赖,例如第三方类库,还包含了以任务形式实现某个特殊目的的指令和它们的相互依赖关系。在通常情况下,会使用脚本语言来表达构建逻辑。这就是为什么一个构建文件也叫做构建脚本的原因。
构建的输入和输出
一个任务会接受一个输入,然后执行一系列步骤,最后产生一个输出。某些任务也需不需要输入,也不需要产生一个必要的输出。在复杂的任务依赖关系中,也许会使用一个依赖任务的输出作为输入。例如,我们将源代码文件作为输入,将它们编译为class文件,并组装成可交付软件作为输出。编译和组装过程各表示一个任务。只有先编译了源代码,组装可交付软件才有意义。因此两任务需要保证它们的顺序。
构建引擎
构建文件的一步步指令或者规则集必须被翻译成构建工具可以理解的内部模型。构建引擎会在运行时处理构建文件,解析任务之间的依赖,设置好执行做需要的全部配置。一旦内部模型建立好了,引擎就会按照正常的顺序去执行一系列任务。某些构建工具还允许你通过API去访问这个模型,以便运行时获取构建信息。
构建管理器
依赖管理器用于处理你在build文件中声明的依赖定义,从工件仓库(例如,本地文件系统、一个FTP或者HTTP服务器)中解析它们,并使它们对项目可用。一来通常是指外部依赖,一种JAR文件形式的可重用类库(例如,Log4j对日志的支持)。该仓库就像依赖的储藏所,通过标识符和描述它们,例如名字和版本。一个典型的仓库可以是HTTP服务器或者本地文件系统。许多类库还依赖于其他类库,这叫做传递依赖。依赖管理器可以通过存储在仓库中的元信息自动的解析传递依赖。但是一个构建工具并不要求提供这样的依赖管理组件。
How:
1、灵活性
谷歌选择Gradle作为Android的官方构建工具 ; 不是因为构建脚本是代码,而是因为Gradle以最基本的方式可扩展的方式建模。Gradle的模型还允许它用于C / C ++的本地开发,并且可以扩展到涵盖任何生态系统。例如,Gradle的设计考虑了使用其Tooling API嵌入。
Gradle和Maven都提供了约定优于配置。然而,Maven提供了一个非常严格的模型,使定制变得乏味,有时甚至是不可能的。虽然这可以使任何给定的Maven构建更容易理解,但只要您没有任何特殊要求,它也会使它不适合许多自动化问题。另一方面,Gradle是在充分授权和负责任的用户的基础上构建的
2、性能
缩短构建时间是最快速发货的最直接方式之一。Gradle和Maven都采用某种形式的并行项目构建和并行依赖性解析。最大的区别是Gradle的工作避免和增量机制。使Gradle比Maven快得多的前3个功能是:
- 增量 - Gradle通过跟踪任务的输入和输出并仅运行必要的操作来避免工作,并且只处理在可能的情况下更改的文件。
- 构建缓存 - 使用相同的输入(包括计算机之间)重用任何其他Gradle构建的构建输出。
- Gradle守护进程 - 一种长期存在的进程,可将构建信息保持在内存中“热”。
在Gradle与Maven性能比较中,这些和更多性能特性使Gradle在几乎每种情况下的速度至少快两倍(使用构建缓存的大型构建速度快100倍)
3、用户体验
Maven的任期较长意味着它通过IDE的支持对许多用户来说更好。但是,Gradle的IDE支持继续快速提升。例如,Gradle现在有一个基于Kotlin的DSL,可以提供更好的IDE体验。Gradle团队正在与IDE制造商合作,以更好地提供编辑支持 - 敬请关注更新。
虽然IDE很重要,但是大量用户更喜欢通过命令行界面执行构建操作。Gradle提供了一个现代CLI,具有可发现功能,如“gradle tasks”,以及改进的日志记录和命令行完成。
最后,Gradle提供了一个基于Web的交互式UI,用于调试和优化构建:构建扫描。这些也可以在本地托管,以允许组织收集构建历史记录并进行趋势分析,比较构建以进行调试或优化构建时间。
4、依赖管理
两个构建系统都提供了内置功能,可以解析来自可配置存储库的依赖关系。两者都能够在本地缓存依赖项并并行下载它们。
作为库使用者,Maven允许覆盖依赖项,但仅限于版本。Gradle提供可自定义的依赖项选择和替换规则,可以声明一次并在项目范围内处理不需要的依赖项。此替换机制使Gradle能够一起构建多个源项目以创建复合构建。
Maven具有很少的内置依赖范围,它们在常见场景中强制使用笨拙的模块架构,例如使用测试夹具或代码生成。例如,单元测试和集成测试之间没有分离。Gradle允许自定义依赖项范围,从而提供更好的建模和更快的构建。
作为库生产者,Gradle允许生产者声明`api`和`implementation`依赖关系,以防止不需要的库泄漏到消费者的类路径中。Maven允许发布者通过可选的依赖项提供
总的来说,Gradle和Maven都是项目自动构建工具,编译源代码只是整个过程的一个方面,更重要的是,你要把你的软件发布到生产环境中来产生商业价值,所以,你要运行测试,构建分布、分析代码质量、甚至为不同目标环境提供不同版本,然后部署。整个过程进行自动化操作是很有必要的。
Why:
项目自动化对于团队的成功是非常的重要的。如今,发布时间对于市场变得比以前更重要了。能够以一种可重复、可持续的方式构建和交付软件是关键。接下来看一看项目自动化所带来的好处:
1.防止手动介入
不得不手动地执行每一步去实现和交付软件是耗时且易于犯错的。坦白地说,作为一个开发人员和管理员,比起编译过程和拷贝文件,还有更重要的事情要做。我们都是人,难免会犯错,而且手动加入还会占用你真正做实际事情的时间。软件开发过程中的任何一步都是能够且应该被自动化的。
2.创建可重复的构建
软件的构建通常都是有预定义和有序的步骤。比如,你需要先编译源代码,然后运行测试,最后组装可交付软件。你将需要每天一遍又一遍的重复运行相同的步骤。这应该和按一下按钮一样简单。无论是谁在运行该构建,构建过程的结果都应该是可重复的。
3.让构建携带
你可以发现,能够在IDE(集成开发环境)中运行的构建是非常有限的。首先,你必须将特定的产品安装在机器上。其次,IDE也许只适用于某一种操作系统。一个自动化构建不应该依赖于特定的运行环境才能工作,无论是操作系统还是IDE。最佳的方式应该是,自动化任务从命令行运行,它允许你在任何时间和任何一台想要运行构建的机器上运行。
---------------------
作者:Miss比巴卜
来源:CSDN
原文:https://blog.csdn.net/perArther/article/details/52201987