我正在阅读有关Android Testing Samples项目的信息,并注意到名为 Bazel 的“ 新”构建工具正在用于构建Android项目:
实验性淡褐色支持
其中一些示例可以在Linux上使用Bazel构建。这些样本包含一个
BUILD.bazel
文件,该文件类似于build.gradle
文件。外部依赖项在顶级WORKSPACE文件中定义。这是实验功能。要运行测试,请按照Bazel网站上的说明安装最新版本的Bazel(0.12.0或更高版本)。
然后
更新#1:已更新,其中包含farhana的可接受答案,并感谢Jin提供了有关Google构建系统的详细信息。
更新#2:已针对bazel android introduction的Google代码实验室进行了更新。
答案 0 :(得分:8)
Bazel 是内部Google构建系统的一部分,称为Blaze。因此,Bazel已发展为解决一个非常大的问题,该问题在Google看来(但可能不是全部)是独一无二的:
Bazel构建文件
Bazel使用两个配置文件进行操作:BUILD
和WORKSPACE
存在的BUILD 文件告诉Bazel,它正在查看代码包-该代码包包括当前目录及其中的任何子目录,除非该子目录包含构建文件。
WORKSPACE 文件是使用BUILD语言编写的,并且与BUILD文件一样,一个程序包中只能有一个WORKSPACE。 WORKSPACE文件的目的是跟踪项目的外部依赖关系。使用规则将每个外部依赖项添加到WORKSPACE,以下是示例:
Gradle构建文件
Gradle构建系统使用多个文件:build.gradle,settings.gradle和gradlew。 Gradle并没有像Bazel那样按脚本顺序运行每个构建步骤,而是使用Groovy(一种与Java相关的面向对象语言)来处理构建步骤配置。
build.gradle文件定义了构建的配置和执行阶段,将两个使用对象分开。脚本的执行顺序定义如下:
Bazel做得很好的事情包括:
位用于位再现性。这太好了。
与技术无关的内部封装版本。您是否有依赖于某些C代码的python?某些Java前端需要javascript吗? Bazel可以做到这一点,它是少数可以做到的开源构建系统之一。
由于具有可重复性,Bazel可以缓存构建结果,并且仅重建所需的内容。这使其变得快速。
挡板是灵活的。它具有自己的领域语言,因此无论创建者是否听说过,您都可以对其进行扩展以支持需要构建的任何内容。是否想“构建”(语法检查和测试)Javascript?Java? C? C ++?目标C? Fortran?笨蛋?没问题。如果尚未实施,则可以实施。如果您不喜欢它的工作方式,则可以编写自己的。是否要使用自定义编译器?自定义静态检查器?定制测试工具?没问题。世界就是你的牡蛎。
关于榛子的问题
Bazel不是 real 依赖项管理。它管理您的依赖项是什么,但不管理要使用的版本。如果您将整个依赖关系树中的所有内容都签入了一个大型的整体代码存储库(例如Google使用perforce的fork进行了存储),那就很好了。 “ Google方式”是始终构建所有内容,而不是依赖于旧版本。
结论:
这两个版本之间具有相似的功能级别 格式,显然两个系统是用 不同的哲学。 Bazel提供了一个结构化的系统 易于推理,并为 大型且不断增长的产品。另一方面,Gradle提供了 可能感觉熟悉的灵活,有状态,面向对象的界面 那些不经常使用脚本语言的人。
有关更多参考:
答案 1 :(得分:5)
我是该存储库中Bazel支持的作者,并且我在Bazel Android rules团队中工作。 farhana已经给出了一个了不起的答案,但我只想补充几点:
mobile-install
的内置命令,可用于快速迭代地开发Android应用程序。它会构建您的应用程序,分片本机库,dexes和资源文件,并且仅将更改的分片推送到设备以减少构建和部署时间。 Read more about it here。拥有两个适用于Android的构建工具真的很好吗?
不止两个:Buck&Pants是另外两个流行的Android构建系统。每个构建系统都有其优点和缺点,并且被设计和实现为解决一组特定的需求。例如,Bazel(及其周围的工具生态系统)诞生于Google巨大的monorepo,因此它确实很好地解决了可伸缩性问题。
IMO可以选择尝试不同的方法,这是一件好事。
这是否意味着Android开发人员将来可能需要学习这种新的构建工具?
Bazel是开源的,并通过Bazel plugin在Android Studio中提供支持。如果您认为它很有趣,feel free to try it out!我们仍在适应Android规则以在开源世界中工作的早期阶段,因此希望某些功能目前仍在开发中。