Bazel和Gradle有什么区别?

问题描述 投票:125回答:2

谷歌只是open-sourced其构建工具Bazel。这个工具和Gradle有什么区别? Gradle不能做什么,它做得更好,Gradle做得更好?

gradle build-process build-tools bazel
2个回答
139
投票

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

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

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

细微之处在于Gradle想要促进良好的实践,而Bazel想要求它。 Gradle的目标是在Ant体验(自由定义您自己的项目结构与不连贯的结果)和Maven体验(强制执行的最佳实践,没有不同的项目需求空间)之间建立中间地带。 Bazel认为,灵活的项目支持是可能的,而不会牺牲强大的保证,以实现其强大的工作流程。

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

Gradle概述

Gradle是一个高度灵活的系统,使用户可以轻松构建完整,可靠的构建流程,并且对组织项目的方式的限制最小。它通过提供强大的构建块(例如自动依赖性跟踪和检索,紧密集成的插件支持)和通用的Turing完整脚本接口来实现这一点,该接口可以组合这些块,但用户需要。

Gradle强调以下功能:

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

巴塞尔概述

Bazel的发展是出于可靠,高效地构建内部Google项目的需要。由于Google的开发环境异常庞大且复杂,因此Bazel为其构建的完整性和实现它们的异常低性能开销提供了异乎寻常的强大保证。

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

Bazel强调以下功能:

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

37
投票

由于文章链接趋于死亡,这里是the Gradle Team's views on Bazel的摘要(大多数直接取自2015年3月发布的文章):

它旨在解决Google独有的问题;一个巨大的单片代码库(数以亿计的LOC)。

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

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

Bazel不是为了可扩展性而构建的(尽管Bazel开发团队已经对此进行了反驳,并保证他们正在开发可扩展性)。

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

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

没有插件生态系统。

© www.soinside.com 2019 - 2024. All rights reserved.