编译构建-Bazel初识

2019/02/12 开发管理

接触Bazel源于谷歌发起的Service mesh的项目lstio开源工程,该工程为c++语言开发,工程构建没有使用make构建工具,使用了一款谷歌的跨语言、跨平台的编译构建工具,该工具目前已经开源。

该工具从接触以来发现了其很多的优点,尤其是在跨语言、跨平台方面。对于c++的语言来讲,最大的麻烦之处是在于跨平台,不同的操作系统平台,由于支持c++的编译器不同,因此在make的构建工具上面都要去耗费精力构建基于不同平台的编译构建文件。Bazel准确讲比make这种相对原始的工具更进一步,作为一个专业的工程编译构建工具,由于需要支持跨语言、跨平台所以内部实现相对比较复杂一些,学习使用方面也需要一定的成本。

如果你的团队有多语言开发的需求,有专业的软件工程构建团队,那么个人建议Bazel是非常值得研究、学习和应用的一款工具。从认识Bazel编译构建的基本工程结构认识开始,让我们一步步深入理解Bazel编译构建工具使用和原理,对工具的认识和理解也有助于对于这一类开源工程使用其编译构建的应用有更多的理解。

Bazel编译构建工程基本构成如下:

Alt text

首先每个项目都是一个WorkSpace空间,实际上就是一个项目的根目录。在该根目录下基本包括两个构成,一个是WORKSPACE文件(大多数时候为空文件),另一个是内部的项目具体实例Package。
每个Package都是整个工程的一个个内部子Target,实际上内部定义基本就主入口模块、lib库或者jar包甚至第三方引用的包的实体类型。
每个具体的Target由三类概念构成:
1)Rule
说白了就是每个lib或者jar包,可执行程序编译构建的编译和依赖关系定义,该Rule主要在每个Target的BUILD文件中定义。定义一系列编译构建的规则。

2)File
File包括两类文件:
a.源码文件
b.派生文件,是编译器根据指定的规则生成的相关的文件,比如可执行文件、比如lib或者jar等。

3)Package group
为了复杂的项目中存在多个Package实例,比如多个lib库,其中可能存在相互搭配被第三方引用的规则,那么会在相应的BUILD文件中声明这些规则定义。
到目前为止总结一下:

Bazel是一个软件项目工程编译构建工具,该工具实现比make体系相对复杂。该工具支持多语言项目管理,同时支持跨平台编译构建管理。

Bazel每个项目都是从工作空间开始的,每个工作空间是一个完整的项目实现。每个工作空间内部有多个Package的实例,说白了就是相应的模块目录(可以是lib库或者bin可执行程序目录)内部包括了源代码和相应的BUILD规则编译构建的文件。

Search

    Table of Contents