Bazel和Gradle之间有什么区别?

w46czmvw  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(252)

Google只是open-sourced它的构建工具Bazel。这个工具和Gradle有什么区别?它能做Gradle做不到的事情,它做得更好的事情是什么,Gradle做得更好的事情是什么?

2ledvvac

2ledvvac1#

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

Bazel和Gradle强调构建体验的不同方面。在某种程度上,他们的优先级是不相容的-- Gradle对灵活性和非强制性的渴望限制了它可以对构建结构施加的限制,而Bazel对可靠性和性能的渴望必然强制了不可协商的限制。
Gradle与Bazel一样重视性能(增量构建、并行配置和执行、Gradle守护进程)、正确性(基于内容的“最新”检查)和可再现性(对声明性语法、依赖项版本控制、显式声明的依赖项的丰富支持)。Bazel尊重灵活的项目布局需求。
Gradle希望促进良好实践,而Bazel希望要求良好实践。Gradle的目标是在Ant体验(自由定义自己的项目结构,但结果不一致)和Maven体验(强制执行最佳实践,不为不同的项目需求留余地)之间找到一个中间地带。Bazel相信,灵活的项目支持是可能的,而不会牺牲强大的工作流所带来的强大保证。
这两种哲学都不是更“正确”的--哪种工具最适合一个项目取决于该特定项目的价值观。

Gradle概览

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

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

Bazel概览

Bazel是从可靠而高效地构建Google内部项目的需求中发展而来的。由于Google的开发环境异常庞大和复杂,Bazel提供了异常强大的构建完整性保证,并且在实现这些构建时性能开销异常低。
这为围绕可重复构建构建的强大开发工作流提供了基础,其中“构建”成为一个抽象实体,可以被引用、重复、传递到不同的计算机,并传递到任意程序和服务,从而使每个示例都完全相同。
Bazel强调了以下特点:

    • 正确性。* Bazel构建被设计为总是产生正确的输出,句号。如果两个用户在不同的机器上使用相同的Bazel标志在同一个提交中调用同一个构建,他们将看到相同的结果。增量构建和干净构建一样可靠地正确,使后者基本上没有必要。
    • 性能。* 构建被设计为在给定可用资源的情况下尽可能快地执行。任务在其依赖关系链允许的范围内是可并行的。不必要的工作永远不会执行(即“最新”任务总是被跳过)。工作可以自然地外包给远程执行器,以克服本地计算机的限制。
    • 可再现性。* 构建的任何示例都可以在任何环境中忠实地再现。例如,如果一个bug报告说软件Y的版本X在生产环境Z中失败,开发人员可以在自己的机器上忠实地重新创建它,并确信他们正在调试同样的事情。
eqqqjvef

eqqqjvef2#

由于文章链接往往会消失,这里是the Gradle Team's views on Bazel的摘要(大部分直接从2015年3月发表的文章中删除):
它的设计是为了解决谷歌独有的一个问题;一个庞大的单片代码库(数亿个LOC)。
Bazel目前提供的并行化优势将与“我们即将推出的新配置和组件模型”相匹配(请记住此处的文章日期)。
Bazel没有一个高级的声明性构建语言来让开发者容易使用构建。在Google,这可以通过一个拥有构建工具的专业服务团队来弥补。
Bazel并不是为可扩展性而构建的(尽管Bazel开发团队后来已经保证他们正在致力于可扩展性)。
速度是围绕着这样一个想法来优化的,即所有的传递依赖关系都存储在一个大的存储库中;所有的库和工具都被签入到这个中央存储库中。2大多数企业都有更多的分布式依赖关系管理需求。
Bazel和Gradle均适用于Linux、Windows和macOS。
没有插件生态系统。

bqf10yzr

bqf10yzr3#

Gradle主要用于JVM生态系统(Java、Groovy、Scala、Kotlin...)。如果您的项目属于这一领域,并且您必须提出问题,Gradle或Maven将是更好的选择。要对Gradle构建进行故障排除,您只需与Java和JVM生态系统进行争论。
核心Bazel能够检测增量变化(以及分布式构建缓存),并允许您做出React,应用插件/规则来实现增量构建。要设置和维护这一点,需要一些CPP知识,Java和Python(Skylark)和系统管理员的知识。再次如果你要问这个问题,我认为Gradle或Maven将是一个更便宜的投资。使用Bazel,您可以构建任何语言,以任何方式定义,更多的功能,但要付出代价。

相关问题