Google仅open-sourced其构建工具Bazel。这个工具与Gradle有什么区别? Gradle不能做什么,它做得更好,Gradle做得更好?
答案 0 :(得分:139)
免责声明:我在Bazel工作,而且我对Gradle并不熟悉。然而,我的一位同事写了两个系统的比较,我将在这里解释:
Bazel和Gradle强调构建体验的不同方面。在某种程度上,他们的优先级是不相容的 - Gradle对灵活性和非突兀性的渴望限制了它对构建结构的限制,而Bazel对可靠性和性能的渴望必然会强制实施不可协商的限制。
Gradle确实重视Bazel所做的相同原则,即Gradle团队非常重视性能(增量构建,并行化配置和执行,Gradle守护程序),正确性(基于内容的“最新”检查)和可重复性(对声明性语法,依赖性版本控制,显式声明的依赖项的丰富支持)。 Bazel尊重灵活项目布局的需求。
细微之处在于,当巴泽尔想要要求时,格拉德想要推广良好的做法。 Gradle的目标是在Ant体验(自由定义您自己的项目结构与不连贯的结果)和Maven体验(强制执行的最佳实践,没有不同的项目需求空间)之间建立中间地带。 Bazel认为,灵活的项目支持是可能的,而不会牺牲强大的保证,以实现其强大的工作流程。
两种哲学都不是“更正确” - 最适合项目的工具取决于特定项目的价值。
Gradle是一个高度灵活的系统,使用户可以轻松构建完整,可靠的构建流程,并且对组织项目的方式的限制最小。它通过提供强大的构建块(例如自动依赖性跟踪和检索,紧密集成的插件支持)和通用的Turing完整脚本接口来实现这一点,该接口可以组合这些块,但用户想要。
Gradle强调以下功能:
Bazel的发展是出于可靠而有效地构建内部Google项目的需要。由于Google的开发环境异常庞大且复杂,因此Bazel为其构建的完整性和实现它们的异常低性能开销提供了异乎寻常的强大保证。
这为围绕可重现构建构建的强大开发工作流奠定了基础,其中“构建”成为一个抽象实体,可以引用,重复,传递到不同的机器,并传递给任意程序和服务,使每个实例都是已知完全相同。
Bazel强调以下功能:
答案 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,您可以以定义的任何方式构建任何语言,但功能更强大,但成本更高。