Step 1. Clone Project(Linux下命令: git clone https://github.com/bazelbuild/bazel.git)
Bazel是个构建、测试工具,类似Make, Maven以及 Gradle,主要优点有:
抽象的、人类可阅读的、面向语义的、高层次编译指令,用来描述项目的编译属性。不像其他编译工具你还要为很细小的编译细节指定编译、链接行为,Bazel控制的对象是库、二进制程序、脚本、数据集等,让你不再需要处理编译器、链接器层面的问题。
快速、可靠。Bazel会跟踪已经执行过的工作,并且追踪文件内容、构建命令的发生的改变,这样就知道什么时候需要重新构建,也只构建这一部分。为了进一步提升构建速度,你可以对工程进行高并发以及增量构建配置。
支持Linux、MacOS、Windows平台,在同一个工程中能够构建用于多个平台的二进制程序以及可部署包,这里说的平台包括桌面电脑,服务器,移动端。
可伸缩性。Bazel处理包含了10万多个源代码文件时,依然具有敏捷性。而且,它支持数以万计的多个repositories和用户。
可扩展性。支持多种编程语言,你可以扩展Bazel,来支持任何其他语言和框架。
1. 为工程新建一个workspace,也就是Bazel查找输入和构建文件的路径,同时用来保存输出。
2. 编辑BUID文件,这个文件将指导Bazel的构建过程。
3. 使用Starlark声明构建目标,Starlark是个domain-specific 语言。
a. 构建目标需要指定一组输入artifacts(构件)作为Bazel构建时需要增加的依赖,一个用来构建的规则,以及配置构建规则的选项。
b. 构建规则指定了Bazel会使用哪些构建工具,比如编译器和链接器,以及它们的配置。对于支持的语言,在支持的平台上,Bazel自带一些编译规则,覆盖了大多数最常用的artifact(构件)种类。
4. 执行bazel命令,bazel将在workspace中生成输出。
5. 除了用来构建目标程序,你也可以用bazel来测试和查询,来跟踪代码依赖。
Bazel工作原理
1. 加载与target相关的BUILD文件。
2. 分析输入以及它们的依赖,根据指定的构建规则,生成action-graph。
3. 执行action-graph中的action,直到生成输出target为止。
4. 因为Bazel具有cache机制,因此bazel必然需要识别、重用cache的artifacts,只重新构建或者重新测试改变了的那一部分。为了进一步确保正确性,你可以配置bazel,让它的构建、测试过程通过沙箱完成。
弱弱问一句,action-graph是啥?
它表述了构建的artifacts,彼此之间的关系,以及bazel可能会执行的action。幸亏有action-graph,bazel才能跟踪文件内容以及action的变更(比如构建或者测试命令),bazel才能知道哪些工作之前已经完成,它也使跟踪代码依赖变得更容易。
我们怎么用Bazel呢?
下面以一个C++程序为例,学习以下内容:
1. 构建target
2. 可视化展示工程的依赖
3. 把项目切割成多个targets和packages
4. 控制target在不同packages里的可见性
5. 通过label查找target
1. 克隆下来实例代码,不然自己写起来太慢了
git clone https://github.com/bazelbuild/examples
2. 查看下这个project的目录结构
cpp-tutorial
├── README.md
├── stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ ├── README.md
│ └── WORKSPACE
├── stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-greet.cc
│ │ ├── hello-greet.h
│ │ └── hello-world.cc
│ ├── README.md
│ └── WORKSPACE
└── stage3
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
├── main
│ ├── BUILD
│ ├── hello-greet.cc
│ ├── hello-greet.h
│ └── hello-world.cc
├── README.md
└── WORKSPACE