目录
- bazel那些事——序
- bazel那些事——安装、概览、常用命令
- bazel那些事——一个完善bazel项目需要的元素
- bazel那些事——C/C++ demo
- bazel那些事——Python demo
- bazel那些事——Java demo
- bazel那些事——Andriod demo
- bazel那些事——iOS demo
- bazel那些事——编译工具链配置
- bazel那些事——编写规则
- bazel那些事——常见项目和规则
一、bazel是什么
bazel是google开源的一个类似于maven、gradle、cmake、meson的构建工具。
二、bazel解决了什么问题
构建工具万万千,即使C/C++,都存在make、cmake、meson、ninja、xmake......,那bazel能解决什么问题呢?
- 能有效解决C/C++没有包管理的历史,相对于conna,bazel使用全源码方式,更适合开发者。rust比C/C++包管理好用,这点将很快成为历史
- 能将C/C++尽可能的以最小集编译和验证,有包的概念,某种程度上实现了C++20的module功能。如果对C++开发有较深的理解,这个极大了提高了开发和验证效率
- 集成了测试系统
- 跨平台,也可以很方便交叉编译
- 提供了starlark类python脚本语言,可以非常容易、便捷的创建出规则满足任意需求,写了这么多年C++,makefile和cmake的语法目前还法熟练
- 多语言支持,由于规则非常灵活,事实上可以提供任意语言的构建,未来有望一统构建
- 生态较为完善,目前已经有很多开源项目和大公司采用bazel作为构建工具,不仅仅局限于C/C++,很多公司开始将bazel应用于iOS/Android/Java等等
- 全源码编译方式,使得C++也可以像Java一样,本地构建,跑单测。结束了没有特定环境,就没法开发、运行的黑暗历史了。当然由于C++本身跨平台的问题,一个linux项目很可能是没法在window下构建的。但是最起码不再挑剔linux版本和编译器版本了。
- 支持构建缓存,远程缓存,增量构建
三、为什么选择bazel
上面讲了这么多bazel的功能,根据我在大型对性能要求极高的C++项目的经验,可以确定,目前bazel能满足大部分需求,能极大的提高开发效率和体验,建议新项目都采用bazel来作为构建方式。即使Android、Java、iOS这些构建工具已经比较完善的语言,新项目也应该选择bazel来构建,因为构建还要考虑构建工具统一性,增量构建,构建速度,流水线等一些列问题,而bazel能一站式解决这些问题。抛去历史和政治问题的话,bazel有一统构建工具的前景。因此为了避免以后迁移构建的工作,新项目都应该采用bazel来构建。
当然bazel当前还是有一些需要完善的地方,最大的问题就是成熟可靠的构建规则还没到能满足一切需求的地步。自己写构建规则的话,得看完整个bazel的文档,但是文档写的不够简练,上手比较困难。遇到一些非常特殊的需求的话,可能解决方式也没那么优雅。但是这一点不影响我们拥抱bazel,毕竟太好用了。
四、本系列文章的意义
bazel官方的文档大而全,但是太啰嗦,就好比C++有一本又一本的教材,但是没有一本教材聚焦于怎么快速上手,怎么清晰且简洁的把C++重点阐述出来。工作这么久以后,回头看C++ Primer都写的非常一般。
本系列文章专注于解决实际工作中问题,不探讨茴香豆有几种写法的各种tricky,追求切实理解和解决工作中会遇到的问题,不追求大而全。毕竟大而全,可以chatgpt,可以stackoverflow,可以google,可以github,完全没必要掌握方方面面,把工作中用到的90%的东西理解透才是王道,剩下10%有需要查资料就好了。
本系列文章将会关注bazel的方方面面,包括使用、常用的一些规则、怎么编写规则来满足一些特殊需求。力求把使用bazel过程中遇到的问题、一些理解,简单直白的写出来。读者要是有疑问的话,可以留言,一起讨论,我也会不断修改表达方式,来把问题讲清楚。
本人也提供bazel构建相关的有偿咨询