160

谷歌刚刚开源了它的构建工具Bazel这个工具和Gradle有什么区别?Gradle 不能做什么,它在哪些方面做得更好,Gradle 在哪些方面做得更好?

4

3 回答 3

198

免责声明:我在 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 的发展源于可靠且高效地构建 Google 内部项目的需要。由于 Google 的开发环境异常庞大和复杂,Bazel 为其构建的完整性提供了异常强大的保证,并且在实现它们时性能开销异常低。

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

Bazel 强调以下特点:

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

由于文章链接容易失效,这里总结了 Gradle 团队对 Bazel 的看法(大部分直接摘自 2015 年 3 月发表的文章):

它旨在解决谷歌独有的问题;庞大的单体代码库(数亿个 LOC)。

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

Bazel 没有高级声明式构建语言,无法让开发人员轻松使用构建。在 Google,这可以通过拥有构建工具的专业服务团队来弥补。

Bazel 不是为可扩展性而构建的(尽管 Bazel 开发团队已经反驳了这一点,并保证他们正在致力于可扩展性)。

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

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

没有插件生态系统。

于 2016-05-17T11:07:19.927 回答
3

Gradle 主要用于 JVM 生态系统(Java、Ggroovy、Scala、Kotlin ...)。如果您的项目在这个领域,并且您必须提出问题,Gradle 或 Maven 将是更好的选择。要对 Gradle 构建进行故障排除,您将只使用 Java 和 JVM 生态系统。

Bazel 的核心是能够检测增量更改(以及分布式构建缓存)并允许您做出反应,应用插件/规则来实现增量构建。要设置和维护这需要一点 CPP、Java 和 Python(云雀)的知识以及系统管理员的知识。如果你不得不问这个问题,我认为 Gradle 或 Maven 会是更便宜的投资。使用 Bazel,您可以构建任何语言,以您定义的任何方式,更强大,但需要付出代价。

于 2019-11-03T13:04:31.213 回答