Bazel和Gradle有什么区别?


Answers:


171

免责声明:我在Bazel上工作,但对Gradle并不十分熟悉。但是,我的一位同事写了两个系统的比较,我将在这里解释一下:

Bazel和Gradle强调了构建体验的不同方面。在某种程度上,它们的优先级是不兼容的-Gradle对灵活性和非干扰性的需求限制了它对构建结构的限制,而Bazel对可靠性和性能的渴望必然会强制实施不可协商的限制。

Gradle确实重视与Bazel相同的原则,即Gradle团队非常重视性能(增量构建,并行化配置和执行,Gradle守护程序),正确性(基于内容的“最新”检查)和可重复性(对声明性语法,依赖项版本控制,显式声明的依赖项的丰富支持)。Bazel尊重对灵活项目布局的需求。

细微的差别是,Gradle希望推广良好做法,而Bazel则要求这样做。Gradle的目标是在Ant经验(自由定义具有不一致结果的项目结构)和Maven经验(强制性最佳实践,不能满足项目需求的余地)之间取得中间立场。Bazel相信,在不牺牲强大功能保障的前提下,灵活的项目支持是可能的。

两种哲学都不是“正确的”-哪种工具最适合项目取决于该项目的价值。

摇篮概述

Gradle是一个高度灵活的系统,它使用户可以轻松构建完整,可靠的构建流程,而对组织项目的方式的限制则最小。它通过提供功能强大的构建块(例如,自动依赖项跟踪和检索,紧密集成的插件支持)以及通用的,图灵完备的脚本编写界面来实现此功能,该界面可以根据用户的需要组合这些块。

Gradle强调以下功能:

  • 易于从其他系统迁移。Gradle可以轻松容纳任何项目组织,以轻松实现任意工作流结构。它本机理解Ant任务,并本机与Maven和Ivy存储库集成。
  • 高度可扩展的脚本模型。用户通过编写Groovy脚本来实现所有构建逻辑。“构建”只是一般任务的依赖顺序执行,这些任务本质上是开放式的,可重写的,可扩展的方法定义。
  • 丰富的依赖项管理。可以从外部代码存储库,本地文件系统和其他Gradle项目中声明并自动暂存版本化的依赖项。构建输出同样可以自动发布到存储库和其他位置。
  • 紧密集成的插件系统。插件只是组织成束的任务,以简化所需的工作流程。Gradle的许多“核心”功能实际上是通过插件(例如Java,Android)实现的。插件(根据自己的判断)与构建脚本逻辑紧密交互。插件享有对Gradle核心数据结构的深度访问。

Bazel概述

Bazel摆脱了可靠,高效地构建内部Google项目的需求。由于Google的开发环境异常庞大且复杂,因此Bazel为其构建的完整性提供了非同寻常的有力保证,而在实现它们方面的性能开销却异常低。

这为围绕可重现的构建构建强大的开发工作流提供了基础,其中“构建”成为一个抽象实体,可以对其进行引用,重复,传递给不同的机器,并传递给任意程序和服务,从而使每个实例都被认为是完全相同的。

Bazel强调以下功能:

  • 正确性。Bazel版本旨在始终产生正确的输出周期。如果两个用户在不同的计算机上使用相同的Bazel标志在同一提交处调用同一构建,则他们将看到相同的结果。增量构建与干净构建一样可靠,因此基本上不需要后者。
  • 性能。在给定可用资源的情况下,构建旨在尽可能快地执行。任务在其依赖链允许的范围内可并行化。永远不会执行不必​​要的工作(即始终跳过“最新”任务)。自然可以将工作分发给远程执行者,以克服本地计算机的限制。
  • 重现性。可以在任何环境中忠实地复制构建的任何实例。例如,如果一个错误报告说软件Y的版本X在生产环境Z中失败,则开发人员可以放心地在自己的机器上重新创建它,并确信他们正在调试同一件事。

18
两个系统的比较是否可以公开获得?如果是,可以分享吗?
卡洛斯·巴塞罗那

43

随着文章链接的消失,以下是Gradle团队对Bazel观点的摘要(大部分直接摘自于2015年3月发布的文章):

它旨在解决Google独有的问题;庞大的整体代码库(亿万LOC)。

Bazel当前提供的并行化优势将与“我们即将推出的新配置和组件模型”相匹配(请记住此处的文章日期)。

Bazel没有高级的声明性构建语言,该语言使开发人员易于使用该构建。在Google,这可以由拥有构建工具的专业服务团队来补偿。

Bazel并不是为可扩展性而构建的(尽管从那时起,Bazel开发团队就以保证可扩展性为目标进行了反击)。

围绕所有传递依赖项都存储在一个大型仓库中的想法优化了速度。所有库和工具都签入到此中央存储库。大多数企业具有更多的分布式依赖管理要求。

Bazel仅* nix,不能在Windows上运行。这消除了大量潜在的企业。

没有插件生态系统。


17
作为此答案的更新,请注意:1. Bazel在可扩展性方面进行了很多改进(由于社区,现在支持许多新语言),2.有一个实验Windows版本(bazel.build/versions/master/docs/ windows.html)。Windows支持今年应该会改进很多。
洛朗

3
这个答案不准确。Bazel可通过称为Starlark的高级语言进行扩展,该语言与Python非常相似。有一个插件生态系统。Bazel在Windows上工作。Bazel不需要单存储库。
sdgfsdh

2
从未发生过的“我们即将推出的新配置和组件模型”。他们似乎删除了Gradle文章中与该链接的任何链接。但是在2014年,他们可能在谈论现在弃用“基于规则的模型配置”。这个小小的实验使Gradle付出了很多,因为它几乎将社区分成了一半。
Renato

1

Gradle主要用于JVM生态系统(Java,Ggroovy,Scala,Kotlin等)。如果您的项目在这一领域,而您不得不问这个问题,那么Gradle或Maven将是一个更好的选择。要对Gradle构建进行故障排除,您将只使用Java和JVM生态系统。

Bazel的核心功能是能够检测增量更改(以及分布式构建缓存),并允许您做出反应,应用插件/规则来实现增量构建。要设置和维护此内容,需要具备CPP,Java和Python(Skylark)的一些知识以及System Admin的知识。同样,如果您不得不问这个问题,我认为Gradle或Maven会是一种便宜的投资。使用Bazel,您可以以您定义的任何方式构建任何一种语言,以增强功能,但要付出一定的代价。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.