Bazel FAQ

使用'bazel'标签询问StackOverflow的技术问题

什么是巴泽尔?

Bazel是一款自动化软件构建和测试的工具。支持的构建任务包括运行编译器和连接器来生成可执行程序和库,以及为Android,iOS和其他目标环境组装可部署的软件包。Bazel与Make,Ant,Gradle,Buck,Pants和Maven等其他工具类似。

巴泽尔有什么特别之处?

Bazel的设计符合Google开发软件的方式。它具有以下特点:

  • 多语言支持:Bazel支持Java,Objective-C和C ++,并且可以扩展以支持任意编程语言。

  • 高级构建语言:项目用BUILD语言描述,这是一种简洁的文本格式,将项目描述为小型互连库,二进制文件和测试集。相反,使用Make等工具,您必须描述单个文件和编译器调用。

  • 多平台支持:可以使用相同的工具和相同的BUILD文件为不同的体系结构甚至不同的平台构建软件。在Google,我们使用Bazel来构建从我们数据中心系统上运行的服务器应用程序到运行在手机上的客户端应用程序的所有内容。

  • 可重复性:在BUILD文件中,每个库,测试和二进制文件都必须完全指定它的直接依赖关系。Bazel使用这个依赖关系信息来了解在对源文件进行更改时必须重建的内容,以及哪些任务可以并行运行。这意味着所有构建都是增量式的,并且始终会产生相同的结果。

  • 可扩展:Bazel可以处理大型构建; 在谷歌,通常服务器二进制文件具有100k的源文件,并且在没有文件改变的情况下建立约200ms。

为什么Google不使用...?

  • Make,Ninja:这些工具非常精确地控制了哪些命令被调用来构建文件,但是由用户编写正确的规则。

    用户在更高层次上与Bazel进行交互。例如,Bazel内置了“Java测试”,“C ++二进制”以及“目标平台”和“主机平台”等概念。这些规则已经过战斗测试,万无一失。

  • Ant和Maven:Ant和Maven主要面向Java,而Bazel则处理多种语言。Bazel鼓励将代码库细分为更小的可重用单元,并且只能重建需要重建的代码库。当使用更大的代码库时,这可以加快开发速度。

  • Gradle:Bazel配置文件比Gradle更具结构性,让Bazel准确理解每个动作的作用。这允许更多的平行度和更好的重复性。

  • Pants,Buck:这两款工具都是由前Google员工分别在Twitter,Foursquare和Facebook创建和开发的。它们是以Bazel为模型的,但它们的功能集是不同的,所以它们对我们来说不是可行的选择。

巴泽尔从哪里来?

Bazel是Google用于在内部构建其服务器软件的工具。它已经扩展到构建其他软件,例如连接到我们的服务器的移动应用程序(iOS,Android)。

你是否将你的内部工具改写为开放源代码?它是一个叉子吗?

Bazel将其大部分代码与内部工具共享,并且其规则每天用于数百万次构建。

Google为什么要创建Bazel?

很久以前,Google使用大量生成的Makefiles来构建它的软件。这导致了缓慢且不可靠的构建,这开始干扰了我们开发人员的生产力和公司的敏捷性。巴泽尔是解决这些问题的一种方式。

Bazel是否需要构建集群?

谷歌内部的Bazel风格确实使用了构建集群,因此Bazel确实在代码库中插入了插入远程构建缓存或远程执行系统的代码。

开源的Bazel代码在本地运行构建操作。我们相信这对于大多数用户来说足够快,但正在进行提供分布式缓存的工作

Google开发过程如何工作?

对于我们的服务器代码库,我们使用以下开发工作流程:

  • 我们所有的服务器代码都位于一个庞大的版本控制系统中。

  • 每个人都用Bazel建立他们的软件。

  • 不同的团队拥有源代码树的不同部分,并将其组件作为BUILD目标提供。

  • 分支主要用于管理版本,所以每个人都在头版修订中开发他们的软件。

Bazel是这一理念的基石:自从Bazel要求所有依赖关系得到全面规定以来,我们可以预测哪些程序和测试会受到变更的影响,并在提交之前对其进行审核。

关于Google开发过程的更多背景可以在eng工具博客上找到

你为什么要开放巴泽尔?

构建软件应该既有趣又简单。缓慢和不可预测的构建可以从编程中获得乐趣。

我为什么要使用Bazel?

  • Bazel可能为您提供更快的编译时间,因为它只能重新编译需要重新编译的文件。同样,它可以跳过重新运行的测试,它知道它没有改变。

  • 巴泽尔产生确定性的结果。这消除了增量和干净构建,笔记本电脑和CI系统等之间的偏差。

  • Bazel可以使用同一工作区中的相同工具构建不同的客户端和服务器应用程序。例如,您可以在一次提交中更改客户端/服务器协议,并测试更新的移动应用程序与更新后的服务器协同工作,使用相同的工具构建两者,从而获得Bazel的所有上述优势。

我能看到例子吗?

是。举个简单的例子,请看:

https://github.com/bazelbuild/bazel/blob/master/examples/cpp/BUILD

Bazel源代码本身提供了一个更复杂的例子:

https://github.com/bazelbuild/bazel/blob/master/src/BUILD

巴泽尔最擅长什么?

Bazel在构建和测试具有以下属性的项目时闪耀:

  • 具有大型代码库的项目
  • 以(多种)编译语言编写的项目
  • 在多个平台上部署的项目
  • 有广泛测试的项目

我可以在哪里运行Bazel?

Bazel在Linux,macOS(OS X)和Windows上运行。

只要JDK可用于平台,移植到其他UNIX平台应该相对容易。

我不应该用什么Bazel?

  • Bazel试图对缓存做出明智的决定。这意味着它不适合运行其输出不应该被缓存的构建操作。例如,不应该从Bazel运行以下步骤:

    • 从互联网获取数据的编译步骤。
    • 连接到您网站的QA实例的测试步骤。
    • 部署步骤,可以更改您网站的云配置。
  • 如果你的构建包含几个长时间的连续步骤,Bazel可能无法提供太多帮助。Bazel可以并行运行更长的步骤,以获得更快的速度。

Bazel的功能集有多稳定?

核心功能(C ++,Java和shell规则)在Google内部有广泛的用途,所以它们经过了彻底的测试,并且流失很少。同样,我们每天测试数十万个目标的Bazel新版本以查找回归,并且我们每个月都会多次发布新版本。

总之,除了标记为实验的功能外,Bazel应该是Just Work。对非实验规则的更改将向后兼容。我们的支持文档中可以找到更详细的功能支持状态列表 

Bazel作为一个二进制文件有多稳定?

Google内部,我们确保Bazel崩溃非常罕见。这也适用于我们的开源代码库。

我如何开始使用Bazel?

请参阅我们的入门文档

Docker不解决可重复性问题吗?

使用Docker,您可以轻松创建带有固定操作系统版本的沙箱,例如Ubuntu 12.04,Fedora 21.这就解决了系统环境的可重复性问题 - 即“我需要哪个版本的/ usr / bin / c ++? “

Docker没有提到源代码更改的可重复性。在Docker容器内运行一个不完美的Makefile文件仍然会产生不可预知的结果。

在谷歌内部,我们将工具检查到源代码控制以获得可重复性。通过这种方式,我们可以使用与对基本库进行更改相同的机制(“修复OpenSSL中的修订边界检查”)来检查对工具的更改(“将GCC升级到4.6.1”)。

我可以构建在Docker上部署的二进制文件吗?

借助Bazel,您可以在C / C ++中构建独立的,静态链接的二进制文件,以及为Java构建的自包含的jar文件。这些在正常的UNIX系统上运行的时候很少依赖,因此应该很容易在Docker容器中安装。

Bazel具有构造更复杂程序的约定,例如,消耗一组数据文件的Java程序,或者将另一个程序作为子过程运行。可以打包独立归档等环境,以便将它们部署到不同的系统上,包括Docker镜像。

我可以用Bazel建立Docker镜像吗?

是的,您可以使用我们的 Docker规则 来构建可重复使用的Docker镜像。

Bazel会使我的构建自动重现吗?

对于Java和C ++二进制文件,是的,假设你不改变工具链。如果您构建涉及自定义配方的步骤(例如,通过规则中的shell脚本执行二进制文件),则需要特别小心:

  • 不要使用未声明的依赖关系。沙盒执行(--spawn_strategy = sandboxed,仅在Linux上)可以帮助查找未声明的依赖关系。

  • 避免在生成的文件中存储时间戳和用户ID。ZIP文件和其他档案尤其容易发生。

  • 避免连接到网络。沙盒执行也可以在这里帮助。

  • 避免使用随机数的进程,特别是字典遍历在许多编程语言中是随机的。

你有二进制版本吗?

是的,你可以在这里找到最新版本的二进制文件 我们的发布政策记录在这里

我使用Eclipse / IntelliJ / XCode。Bazel如何与IDE进行互操作?

对于IntelliJ,请使用Bazel插件检查IntelliJ

对于XCode,请查看Tulsi

对于Eclipse,请查看E4B插件

对于其他IDE,请查看关于这些插件如何工作博客文章

我使用Jenkins / CircleCI / TravisCI。Bazel如何与CI系统进行互操作?

如果构建或测试调用失败,Bazel会返回一个非零的退出代码,这对于基本的CI集成来说应该足够了。由于Bazel不需要清理构建以保证正确性,因此在开始构建/测试运行之前,不应将CI系统配置为清理。

有关退出代码的更多详情,请参见用户手册

Bazel可以期待未来的功能吗?

我们最初的目标是致力于Google的内部使用案例。这包括Google的主要语言(C ++,Java,Go)和主要平台(Linux,Android,iOS)。出于实际原因,并非所有这些都是开源的。欲了解更多详情,请参见我们的 路线图

那么Python呢?

可以将Python规则编写为扩展(见下文)。有关为python生成自包含zip文件的示例,请参阅以下文件:

https://github.com/bazelbuild/bazel/blob/master/tools/build_rules/py_rules.bzl\ https://github.com/bazelbuild/bazel/tree/master/examples/py

我们已经打开了我们内部Python规则的一个子集,因此它们可以用作帮助脚本作为构建的一部分。

简单支持PEX风格的二进制文件就在 这里

我可以在我的[INSERT LANGUAGE HERE]项目中使用Bazel吗?

我们有一个名为Skylark的扩展机制,允许您在不重新编译Bazel的情况下添加新规则。

有关文档:请参阅此处我们支持使用该扩展机制的多种语言,请参阅我们的 构建百科全书以获取支持语言的完整列表。

我需要更多的功能。我可以添加编入Bazel的规则吗?

如果我们的扩展机制不足以满足您的使用情况,请通过电子邮件向邮件列表发送建议:[email protected]

我可以为Bazel代码库贡献什么?

参见我们的贡献指南

为什么并非所有的开发都是公开的?

我们仍然需要经常重构Bazel中的公共代码和我们的内部扩展之间的接口。这使得在开放中很难进行大量的开发。请参阅我们的治理计划 以了解更多详情

我如何联系团队?

我们可以通过[email protected]联系

我在哪里报告错误?

在GitHub上打开问题

代码库中的“Blaze”是什么意思?

这是该工具的内部名称。请参阅Bazel作为Bazel。

为什么其他Google项目(Android,Chrome)使用其他构建工具?

直到第一个(Alpha)发布之前,Bazel并没有在外部可用,所以开源项目(如Chromium,Android等)无法使用它。另外,最初缺乏Windows支持是构建Windows应用程序(如Chrome)的一个问题。

你怎么发音“Bazel”?

与美国英语中的“罗勒”(草药)相同:“BAY-zel”。它与“榛子”押韵。IPA:/beɪzˌəl/

你可能感兴趣的:(编译器)