Android 与Gradle相比,使用Bazel的附加优势是什么?
我在阅读有关该项目的信息时,注意到一个名为Bazel的“新建”构建工具正在用于构建Android项目: 实验支撑 其中一些示例可以在Linux上使用Bazel构建。这些示例包含一个Android 与Gradle相比,使用Bazel的附加优势是什么?,android,gradle,android-gradle-plugin,android-testing,bazel,Android,Gradle,Android Gradle Plugin,Android Testing,Bazel,我在阅读有关该项目的信息时,注意到一个名为Bazel的“新建”构建工具正在用于构建Android项目: 实验支撑 其中一些示例可以在Linux上使用Bazel构建。这些示例包含一个BUILD.bazel文件,它类似于BUILD.gradle文件。外部依赖项在顶级工作区文件中定义 这是实验特性。要运行测试,请按照Bazel网站上的说明安装最新版本的Bazel(0.12.0或更高版本) 那么 与现有Gradle相比,使用Bazel的附加优势是什么 有两个Android构建工具真的好吗 这是否意味着
BUILD.bazel
文件,它类似于BUILD.gradle
文件。外部依赖项在顶级工作区文件中定义
这是实验特性。要运行测试,请按照Bazel网站上的说明安装最新版本的Bazel(0.12.0或更高版本)
那么
- 与现有Gradle相比,使用Bazel的附加优势是什么
- 有两个Android构建工具真的好吗
- 这是否意味着Android开发者将来可能需要学习这个新的构建工具
更新#1:更新了来自并感谢的已接受答案,以获得有关谷歌构建系统的详细信息
更新#2:用谷歌代码实验室更新。Bazel是谷歌内部构建系统Blaze的一个子集。因此,Bazel已经发展到解决一个非常大的问题,这在某种程度上(但可能并非完全)是谷歌独有的:
- Bazel的配置文件比Gradle的要结构化得多, 让Bazel确切了解每个动作的作用。这允许 以获得更多的平行性和更好的再现性
BUILD
和WORKSPACE
构建文件的存在告诉Bazel它正在查看一个代码包 — 此代码包包括当前目录及其任何子目录,除非子目录包含构建文件
工作区文件是用构建语言编写的,与构建文件一样,包中只能有一个工作区。工作区文件的用途是跟踪项目的外部依赖关系。使用规则将每个外部依赖项添加到工作区 — 以下是一个例子:
渐变生成文件
Gradle生成系统使用几个文件:build.Gradle、settings.Gradle和gradlew。Gradle不像Bazel那样按脚本顺序运行每个构建步骤,而是使用Groovy(一种与Java相关的面向对象语言)处理构建步骤配置
build.gradle文件定义了构建的配置和执行阶段,将两个使用对象分开。脚本的执行顺序定义如下:
Bazel做得很好的事情包括:
- 逐位再现性。这太棒了
- 与技术无关的包内构建。你有一些依赖于C代码的python吗?一些需要javascript作为前端的Java?Bazel可以做到这一点,它是为数不多的能够做到这一点的开源构建系统之一
- 由于其可再现性,Bazel可以缓存构建结果,并且只重建需要的内容。这使它很快
- 巴泽尔很灵活。它有自己的领域语言,因此您可以扩展它以支持您需要构建的任何内容,无论创建者是否听说过它。想要“构建”(语法检查和测试)Javascript?Java?CC++?目标C?Fortran?笨蛋?没问题。如果尚未实现,则可以实现它。如果你不喜欢它的工作方式,你可以自己写。要使用自定义编译器吗?自定义静态检查器?定制测试线束?没问题。世界就是你的牡蛎
- Bazel是谷歌内部使用的构建系统,这意味着它与用于构建YouTube、Gmail和照片等谷歌应用程序的构建系统相同
- 其中一些谷歌应用程序非常庞大,Bazel需要很长时间才能在本地构建它们。因此,Bazel中有一个类似Gradle的,但更细粒度的IIUC,它允许您将构建操作分散到远程执行器群。Bazel有一个静态和封闭的操作依赖关系图,设计为完全可复制,每个操作都有一组完全声明的输入、输出、环境变量、命令行,以及Bazel内有关配置、工具链和主机/目标/执行平台的其他知识。通过该图,Bazel可以安全地将操作分配给远程工作者,从而实现非常大程度的并行性。我已经成功构建了Tensorflow Android应用程序,拥有500个-