老卫带你学---Bazel学习笔记(二)

今天继续学习Bazel的相关概念

安装

bazel提供很多系统的安装介绍,并且也可以在container进行开发,相关的信息在它们官网有介绍:
Bazel安装

概念

1. workspace、package、target
  • workspace: 其实就是bazel所要负责构建的仓库
  • package: 一个workspace下有多个package,每个package里是有BUILD文件来定义
  • target: 一个package里有两大类的target
    • files: 文件里根据来源可以分为两类:
      • source files: 一般指的我们研发人员所写的代码
      • generate files: 一般指的是由其他文件生成的文件
    • rules: 定义了输入和输出的关系,以及构建输出的步骤
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”)

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值