Bazel是一个开源的构建和测试工具,和Make,Maven,Gradle可以看成一类东西。不过Bazel的构建语言更高级,可读性更好,支持多语言、跨平台。Bazel支持跨多个存储库的大型代码库和大量用户。
一、Bazel的优点表现在下面5个方面:
1)高级构建语言:与其他工具不同,Bazel使用库、二进制文件、脚本和数据集的概念,避免了编写文件对编译器和链接器等工具进行调用的复杂性,所以Bazel在描述项目的构建属性上可读性更好。
2)快速可靠:Bazel缓存之前的操作,跟踪文件内容和编译命令的修改,通过这种方式,Bazel知道什么时候需要重建,并且只重建修改的地方。为了进一步加快构建速度,还可以将项目设置为以高度并行和增量的方式构建。
3)跨平台:Bazel可以运行在Linux、macOS和Windows上。Bazel可以从同一个项目为多个平台(包括desktop, server, and mobile)构建二进制文件和可部署包。
4)规模大:Bazel在处理100k+源文件的构建时保持了灵活性,可以与多个存储库和数以万计的用户群协同工作。
5)可扩展:支持多种语言,可以扩展Bazel以支持任何其他语言或框架。
总的来说就是好处多,方便用,代码量多或是开发人员多的情况下依然能表现良好。
二、怎么使用Bazel?
1)肯定是先安装:
1、添加包源:
sudo apt install curl gnupg
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
2、安装:
sudo apt update && sudo apt install bazel
sudo apt update && sudo apt full-upgrade
sudo apt install bazel-1.0.0 (默认安装最新版本,这里指定了版本1.0.0)
2)设置一个workspace,它是Bazel查找构建输入和构建文件以及存储构建输出的目录。
3)编写一个BUILD,告诉Bazel要构建什么以及如何构建。
Bazel用Starlark语法来编写workspace/BUILD文件,它们是类似于Make中的makeifle、CMake中的CMakeLists的存在。
package(default_visibility = ["//visibility:public"])
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
cc_library(
name = "hello-lib",
srcs = ["hello-lib.cc"],
hdrs = ["hello-lib.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [":hello-lib"],
)
cc_test(
name = "hello-success_test",
srcs = ["hello-world.cc"],
deps = [":hello-lib"],
)
cc_test(
name = "hello-fail_test",
srcs = ["hello-fail.cc"],
deps = [":hello-lib"],
)
filegroup(
name = "srcs",
srcs = glob(["**"]),
)
构建目标指定了一组Bazel将构建的输入工件、它们的依赖项、Bazel将用于构建它的构建规则以及配置构建规则的选项。
构建规则指定Bazel将使用的构建工具(如编译器和链接器)及其配置。Bazel附带了许多构建规则,涵盖了受支持平台上受支持语言中最常见的工件类型。
4)运行
运行命令类似:
bazel [<startup options>] <command> [<args>]
bazel [<startup options>] <command> [<args>] -- [<target patterns>]
三、Bazel的运行过程可以参考这篇文章bazel学习总结(一)
四、Bazel有个叫action graph的东西,应该就是DAG吧
action graph表示构建工件、它们之间的关系以及Bazel将执行的构建动作。借助此图,Bazel可以跟踪对文件内容的更改以及对操作(如构建或测试命令)的更改,并知道以前完成了哪些构建工作。该图还使您能够轻松地跟踪代码中的依赖项。