Bazel学习研究
1、什么是Bazel?
Bazel是一个免费的软件工具,可以实现软件的自动化构建和测试。谷歌公司在内部使用构建工具Blaze,并将Blaze工具的一部分开源发布为Bazel,命名为Blaze的字样。
与Make、Apache Ant或Apache Maven等构建工具类似,Bazel使用一套规则从源代码构建软件应用。规则和宏是用Python的一种方言Starlark语言(以前叫Skylark)创建的,有内置的规则,用于构建Java、C、C++、Go、Python、Objective-C和Bourne shell脚本等编程语言编写的软件,Bazel可以制作适合部署在Android和iOS操作系统上的软件应用包。
在设计Bazel的过程中,强调了构建速度、正确性和可重复性,该工具使用并行化来加快构建过程的部分速度,它包含了Bazel Query语言,可以用来分析复杂构建图中的构建依赖性。
2、Bazel的设计理念是什么?
Bazel的目标之一是创建一个构建系统,在这个系统中,构建目标的输入和输出是完全指定的,因此构建系统可以精确地知道它们的输入和输出,这样可以更准确地分析和确定构建系统依赖图中过时的构建工件。使依赖图分析更加准确,通过避免重新执行不必要的构建目标,从而可能改善构建时间。通过避免构建目标可能依赖于过时的输入工件的错误,提高了构建的可靠性。
为了实现更准确的依赖图分析,Bazel使用内容摘要而不是基于文件的时间戳。文件时间戳通常用于检测Make或Apache Ant等工具的变化。由于时钟同步的问题,当构建分布在多个主机上时,时间戳可能会出现问题。Bazel的目标之一是在远程云基础设施上实现分布式和并行构建。Bazel也被设计成可以扩展到非常大的构建仓库,而将其下载到单个开发者的工作机器上可能并不实用。
Bazel提供的工具可以帮助开发人员创建位相同的可重复的构建输出。Bazel实现的规则避免了典型的陷阱,如在生成的输出中嵌入时间戳以确保内容摘要匹配。这反过来又允许构建系统可靠地缓存(memoize)中间构建步骤的输出。此外,可重复的构建使得在组织中的团队或部门之间共享中间构建结果成为可能,使用专用构建服务器或分布式缓存。因此,Bazel特别适合于大型组织和有大量构建依赖的软件项目。确定性的构建和精确分析构建输入和输出工件的能力,跨越依赖图,适合于构建步骤的并行执行。
Bazel可通过其定制的Starlark编程语言进行扩展。Starlark使用的语法是Python编程语言语法的子集。然而Starlark并没有实现Python的许多语言特性,例如能够突变集合或访问文件I/O,以避免扩展可能产生副作用或产生构建系统本身不知道的构建输出。这种副作用有可能导致对构建依赖图的不正确分析。
Bazel被设计为一个多语言的构建系统。许多常用的构建系统在设计时都倾向于特定的编程语言。这种系统的例子包括Java的Ant和Maven,Clojure的Leiningen,Scala的sbt等。在一个多语言项目中,将不同的构建系统结合起来,并实现上述构建速度和正确性的优势,可能会有困难和问题。
Bazel还提供了沙盒式构建执行。这可以用来确保所有的构建依赖关系都被正确地指定,并且构建不依赖于只在开发者的工作计算机上本地安装的库。这有助于确保构建后的系统保持可移植性,并能在其他(远程)环境中执行。
与Bazel最为相似的构建系统有Pants、Buck和Please。Pants和Buck都是为了实现与Bazel相似的技术设计目标,并受到Google内部使用的Blaze构建系统的启发。Blaze也是Bazel的前身。Bazel、Pants、Buck和Please采用Starlark作为BUILD文件解析器,区分其BUILD文件语法。独立开发的构建系统也有类似的目标, 即高效的依赖图分析和自动构建工件跟踪,已经在构建系统中实现,如tup。
3、为什么使用Bazel?
Bazel只重建必要的东西。通过先进的本地和分布式缓存、优化的依赖性分析和并行执行,您可以获得快速和增量的构建。
构建和测试Java、C++、Android、iOS、Go和其他各种语言平台。Bazel可以在Windows、macOS和Linux上运行。
Bazel帮助你扩展你的组织、代码库和持续集成系统。它可以处理任何规模的代码库,无论是多个仓库还是庞大的单体仓库。
使用Bazel熟悉的扩展语言轻松添加对新语言和平台的支持。分享和重用由不断增长的Bazel社区编写的语言规则。
- 点赞
- 收藏
- 关注作者
评论(0)