今天继续学习Bazel的相关概念
安装
bazel提供很多系统的安装介绍,并且也可以在container进行开发,相关的信息在它们官网有介绍:
Bazel安装
概念
1. workspace、package、target
- workspace: 其实就是bazel所要负责构建的仓库
- package: 一个workspace下有多个package,每个package里是有BUILD文件来定义
- target: 一个package里有两大类的target
- files: 文件里根据来源可以分为两类:
- source files: 一般指的我们研发人员所写的代码
- generate files: 一般指的是由其他文件生成的文件
- rules: 定义了输入和输出的关系,以及构建输出的步骤
- files: 文件里根据来源可以分为两类:
2. labels
在Bazel里,label用来唯一标识构建目标以及依赖项。
比如//path/to/package:target,前半部分代表目录或者package,后面就是目标。
通过label,可以在BUILD文件中指明依赖项,从而构建依赖图,进而可以更好的实现增量构建,测试,部署
3.BUILD
每个package中包含BUILD文件,该文件用来定义构建的声明
语言用starlark编写,它本身不支持I/O,仅依赖一组已知的输入,这位构建的重现提供了保障
4.依赖关系
bazel通过构建DAG(有向无环图)来梳理依赖关系,其中包含声明依赖图与实际依赖图。
- 添加声明的依赖,a依赖b,b依赖c。这种情况下,声明依赖图与实际依赖图一致
- 未添加声明的依赖,这种情况需要主要a可能在生命依赖b的时候,实际依赖了c
另外依赖的类型主要有:srcs、deps、data
5.visibility
bazel中有两个可见性系统(目标可见性、负载可见性),这两个可见性系统可以帮助研发人员区分库中的公共API和细节
https://bazel.google.cn/concepts/visibility
目标可见性:
- target visibility:决定了哪个目标可以依赖你,这其实就是哪个目标可以在它的deps中写上你。package是visibility的颗粒单元,这里需要注意一点,赋予包visibility并不代表赋予子包visibility。
- visibility spec: 定义visibility的几个常用关键字
- “//visibility:public”:授予对所有包的访问权限
- “//visibility:private”:不授予任何额外的访问权限;只有此包中的目标才能使用此目标
- “//foo/bar:__pkg__”:授予对//foo/bar(但不包括其子包)的访问权限
- “//foo/bar:__subpackages__”:授予访问权限//foo/bar及其所有直接和间接子包
- “//some_pkg:my_package_group”:授予对属于给定package_group权限
- rule target visibility: 这个是为了指定rule的可见性,已保护一些rule不被其他直接依赖
加载可见性(load visibility):
在加载过程中控制其他文件.bzl是否可以加载它。目标可见性保护的是源码,加载可见性保护的是构建过程。
简单的就是在.bzl最上面加上visibility(“XXXX”)