Build tool

news/2024/8/26 12:26:10

 

什么是构建工具

 

构建工具能够帮助你创建一个可重复的、可靠的、携带的且不需要手动干预的构建。构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。如下图所示,展示了所描述场景中任务和它们执行的顺序。

 

 

 

 

 

每个任务都代表着一个工作单元——例如,编译源代码。顺序是非常重要的。如果所需要的class文件没有被编译出来,那么你是不能够组建构件的。因此编译任务必须先被执行。 
本质上,任务和它们的相互依赖被模块化成一个有向非循环图(DAG)。DAG是计算机科学的一种数据结构,包含下面两个元素: 
节点:一个工作单元;就构建工具而言,它指的是一个任务(例如,编译源代码)。 
有向边:有向边也叫作箭头,表示点节之间的关系。在这里,箭头表示依赖关系。如果一个任务的定义依赖于另一个任务,那么所依赖的任务就必须先被执行。发生这种情况常常是因为一个任务依赖于另一个任务的输出。这里有个例子——要执行任务“组装可交付软件”,你需要先执行任务“拷贝class文件到目录”和“编译源代码”。 
每个节点都知道自己的执行状态。一个节点——表示一个任务——只能被执行一次。 
作为开发人员,你没有必要和DAG图打交道。这个工作是由构建工具来完成的。

 

构建工具的剖析
理解构建工具中组建的交互、构建逻辑和实际定义,以及输入输出的数据是非常重要的。让我们一起来探讨一下构建工具中每一个元素以及它们的职责。

 

构建文件

 

构建文件包含了构建所需的配置信息、定义外部依赖,例如第三方类库,还包含了以任务形式实现某个特殊目的的指令和它们的相互依赖关系。 
就如前面的例子——编译源代码、拷贝class文件到目录以及组装构件——都可以定义在构建文件中。在通常情况下,会使用脚本语言来表达构建逻辑。这就是为什么一个构建文件也叫做构建脚本的原因。

 

构建的输入和输出

 

一个任务会接受一个输入,然后执行一系列步骤,最后产生一个输出。某些任务也需不需要输入,也不需要产生一个必要的输出。在复杂的任务依赖关系中,也许会使用一个依赖任务的输出作为输入。例如,我们将源代码文件作为输入,将它们编译为class文件,并组装成可交付软件作为输出。编译和组装过程各表示一个任务。只有先编译了源代码,组装可交付软件才有意义。因此两任务需要保证它们的顺序。

 

构建引擎

 

构建文件的一步步指令或者规则集必须被翻译成构建工具可以理解的内部模型。构建引擎会在运行时处理构建文件,解析任务之间的依赖,设置好执行做需要的全部配置。 
一旦内部模型建立好了,引擎就会按照正常的顺序去执行一系列任务。某些构建工具还允许你通过API去访问这个模型,以便运行时获取构建信息。

 

构建管理器

 

依赖管理器用于处理你在build文件中声明的依赖定义,从工件仓库(例如,本地文件系统、一个FTP或者HTTP服务器)中解析它们,并使它们对项目可用。一来通常是指外部依赖,一种JAR文件形式的可重用类库(例如,Log4j对日志的支持)。该仓库就像依赖的储藏所,通过标识符和描述它们,例如名字和版本。一个典型的仓库可以是HTTP服务器或者本地文件系统。 
许多类库还依赖于其他类库,这叫做传递依赖。依赖管理器可以通过存储在仓库中的元信息自动的解析传递依赖。但是一个构建工具并不要求提供这样的依赖管理组件。

 

 

构建工具 —— 让项目变得自动化

自动化的好处

项目自动化对于团队的成功是非常的重要的。如今,发布时间对于市场变得比以前更重要了。能够以一种可重复、可持续的方式构建和交付软件是关键。接下来看一看项目自动化所带来的好处:

防止手动介入

不得不手动地执行每一步去实现和交付软件是耗时且易于犯错的。坦白地说,作为一个开发人员和管理员,比起编译过程和拷贝文件,还有更重要的事情要做。我们都是人,难免会犯错,而且手动加入还会占用你真正做实际事情的时间。软件开发过程中的任何一步都是能够且应该被自动化的。

创建可重复的构建

软件的构建通常都是有预定义和有序的步骤。比如,你需要先编译源代码,然后运行测试,最后组装可交付软件。你将需要每天一遍又一遍的重复运行相同的步骤。这应该和按一下按钮一样简单。无论是谁在运行该构建,构建过程的结果都应该是可重复的。

让构建携带

你可以发现,能够在IDE(集成开发环境)中运行的构建是非常有限的。首先,你必须将特定的产品安装在机器上。其次,IDE也许只适用于某一种操作系统。一个自动化构建不应该依赖于特定的运行环境才能工作,无论是操作系统还是IDE。最佳的方式应该是,自动化任务从命令行运行,它允许你在任何时间和任何一台想要运行构建的机器上运行。

 

转载于:https://www.cnblogs.com/madman-fly/p/10480143.html


http://www.niftyadmin.cn/n/929225.html

相关文章

php审计--任意文件上传配合目录文件包含getshell

在黑盒中 源码 数据库配置文件都是很不好找的,,但源码审计不同 所有的漏洞,成因都是相同的,但我们自以最基础的作为代表, 这里文件上传这个点可以配合文件包含一块利用,当某个站对数据处理不严时&#xff…

wpf 右下角弹出窗

wpf 右下角弹出窗 原文:wpf 右下角弹出窗自己写的wpf 弹出框,欢迎拍砖,动画都写在了后台代码,前台代码不太重要,用了一下iconfont,具体样式我就不贴出来了,本次主要是后台代码的动画 需要有父级窗口才可以使…

第八次作业(课堂实战)- 项目UML设计(团队)

1. 团队信息 队名:小白吃队成员: 后敬甲 031602409卢泽明 031602328蔡文斌 031602301葛亮 031602617刘浩 031602423黄泽 031602317黄婧茹 031602315组长:后敬甲2.团队分工 WBS Alpha版本 任务槽 登陆注册界面完成自选窗口的识别结算功能实现学…

php审计--灰盒角度来复现经典反序列化

站在巨人的肩膀上做反序列化复现,, 这里已经找了fwrite()函数和read()函数,file_get_contents($file);都不能代替fopen()函数做复现,,本人水平有限,希望读者不要介意, 我们从灰盒的角度做学习…

App Store评论优化,让你的APP评论上涨

App Store评论优化怎么做 App Store评论优化,让你的APP评论上涨 关于「ASO评论优化」,主要分为三块。换评论,买评论,引导用户写评论。 可能有些刚接触ASO的朋友会问,为什么要给APP做评论呢?ASO优化师的工作不是主要做…

使用 fetch 封装网络请求,返回promise 对象

1.fetch 的概念和用法 fetch 提供了对 Request 和 Response (以及其他与网络请求有关的)对象的通用定义。使之今后可以被使用到更多地应用场景中:无论是service workers、Cache API、又或者是其他处理请求和响应的方式,甚至是任何…

php审计--通过php伪协议配合文件包含写入shell

有群友问过这样一个问题,, http:xxx/123.jpg 传上这样的图片马能不能连到shell? 这有几种情况,,,php解析吧jpg解析成php,iis吧jpg解析成php都可以 我们这里通过php伪协议存在文件包含的页面做个…

列表推导式、生成器表达式

列表推导式 egg ["鸡蛋{}".format(i) for i in range(1, 11)]print(egg)生成器表达式 eggs ("鸡蛋{}".format(i) for i in range(1, 11))for egg in eggs: print(egg)二者的括号不一样,前者是中括号,且返回整个列表&#xff0c…