Bazel和Gradle有什么区别?

时间:2015-03-25 01:06:53

标签: gradle build-process build-tools bazel

Google仅open-sourced其构建工具Bazel。这个工具与Gradle有什么区别? Gradle不能做什么,它做得更好,Gradle做得更好?

3 个答案:

答案 0 :(得分:139)

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

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

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

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

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

Gradle Overview

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

Gradle强调以下功能:

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

Bazel概述

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

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

Bazel强调以下功能:

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

答案 1 :(得分:37)

As article links tend to die, here is a summary of the Gradle Team's views on Bazel (most are directly lifted from the article, which was published in March 2015):

It was designed to solve a problem unique to Google; a massive monolithic codebase (hundreds of millions of LOC).

The parallelisation advantage Bazel currently provides will be matched by "our upcoming new configuration and component model" (bear in mind the article date here).

Bazel does not have a high level declarative build language that makes the build easy to use for developers. At Google this can be compensated with a specialized service team that owns the build tool.

Bazel is not built for extensibility (although the Bazel development team have since countered this with assurances that they are working on extensibility).

Speed is optimised around the idea that all transitive dependencies are stored in one big repo; all libraries and tools are checked in to this central repository. Most Enterprises have more distributed dependency management requirements.

Bazel is *nix only, it does not run on Windows. This eliminates a large number of potential Enterprises.

No plugin ecosystem.

答案 2 :(得分:0)

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

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