bazel 简介(一)—— 基础概念与原理
0x01 背景
bazel目前已广泛用于云计算领域的开源软件的构建如k8s、kubevirt等,本文以一个新手的角度分享下bazel的基础知识,其存在的价值。对比下,它与其他已经存在的构建系统的差别,以及它适用于什么场景。
0x02 构建系统
构建对应的英文是BUILD,也就是大家所说的编译打包,就是将编写出的代码经过编译器处理,产生二进制,形成一个可以正常运行的软件包(如deb或者rpm)。对于编译型语言来说,构建几乎是日常工作的一部分。
- 是一个辅助过程,它本身不产生价值。
- 又是必须的一个过程,没有它CI是空谈。
基于这两个特点来说,我们希望理想的构建系统具备以下特点:
- 尽可能地快。可以方便开发人员,编写代码后快速出包验证改动。
- 方便维护,可以清晰地展示依赖关系,在系统中添加一个模块,或者减少一个模块,可以非常容易维护。
对比理想系统,我们看下构建技术的发民。软件构建技术的发展和IT技术的发展保持同步,历经了初期、中期和现代化三个阶段(纯粹个人理解)。
一、初期
软件规模小,软件工程的概念还未被提出。
这时对构建的要求很低,或者说不需要。编写出的代码可以经过汇编编译后直接执行,也没有流水线。这时期的代码就是makefile,或者是直接自己写脚本进行编译执行。软件的特点是,单语言小规模,对构建基本上没有要求。
二、中期
软件规模开始增大。已有的makefile机制已经难以满足需要。以Linux内核为例,makefile已经无法满足,所以内核开发者在内核中添加了自己的构建扩展,以满足日渐增大的内核代码。同时,也涌现出了cmake这样较现代化的构建工具。主要原因是,代码规模增大后,构建这一不增值过程开始消耗掉大量开发人员的精力,以cmake为代表的工具可以半自动化管理依赖,生成makefile,提高编译人员的生产力,减少了重复劳动; 此时的构建系统基本上可以满足要求,但已经开始显现不足了。
三、现代化
软件规模增大的同时,大型系统开始转向多语言协作。使用运行高效率的编译型语言(C、C++、Java等)编写低层(数据面),使用开发高效率的动态非编译型语言编写上层(管理面)。多语言对于cmake来说,无能为力。此时以bazel为代表的现代构建系统出现,可以很好地解决cmake无法解决的问题。
在一个机构逐步增大的过程中,大公司在IT上经历的问题,你同样会遇到,所以了解一门技术的驱动力一定是问题,而不是Google出品的一定就是适合你的。这里也一样,我去了解Bazel是因为遇到了现有技术无法解决的问题。
[bazel](https://www.bazel.build/](https://www.bazel.build/) Google开源的构建工具。它通过将构建过程进行抽象建模,实现了一个接近理解的构建系统。
- 快速构建。
bazel支持增量式编译,支持缓存,支持分布式扩展。这3点就可以满足快速建构。只要有投入足够多的硬件资源,你的构建就可以很快。 - 清晰的依赖关系。
虽然makefile也可以定义出来。但makefile定义的规则,全部需要人工维护,特别是分散在多个代码仓库中的依赖,很难有人能全局把握好依赖关系。但bazel可以清晰地以依赖关系图的方式展现出当前的依赖关系。而且是自动建立地,可查询。
除了以上两个优点,最重要的一点是bazel支持多语言构建。以下将通过介绍bazel的基本对象(概念),来阐述bazel是如何对构建过程进行建模的。
0x03 概念
3.1 构建
构建过程是一个动作。有输入输出,如下图所示。
一个大型系统中有许多构建过程,有顶层的负责产生最终产出物。有底层负责某个小模块的构建。不同的构建之间,有相互依赖。A的产生物是B的输入,那么B就依赖A,构建上则要求A先于B构建。这些依赖最终在大模块里出的就是一个依赖网。如下图,A依赖B C D,但B也依赖C。
3.2 Bazel中主要的概念如下。
名称 | 解释 |
---|---|
WORKSPACE | 每一个工程都需要定义的一个文件,位于工程的根目录下。可以是空文件,也可以加载一些外部依赖。 |
action | rule中定义的构建动作。全部在运行阶段执行。 |
BUILD | 存在每个小代码仓库中,定义当前仓库中的构建要素。输入、输出和构建行为。是最小的构建单位。 |
bzl | 自定义的规则后缀。 |
external rule | bazel约定的其他规则库,用skylark语言(Python的子集)编写。 |
rule | bazel的构建规则,位于BUILD文件中。每个规则中包含输入和输出,以及构建动作。目前已有C/C++、Java、Golang、Python等成熟的构建规则库,可以方便地从github上获取。见官方文档已有规则库 |
package | 在BUILD文件中定义的一系统目标。包具有可见性属性,可用来控制对外暴露的属性。 |
build graph | 构建依赖图,就是前文提到的依赖关系图。由定义在各个BUILD文件中的目标构成。 |
0x04 原理
有了基础概念之后,解释下bazel的工作原理。bazel以client/server模式工作,server在闲置一段时间后会自动退出。以WORKSPACE[#WORKSPACE]和BUILD文件将整个构建过程模型化。
bazel工作分以下三个阶段(phase)。也就是执行了bazel build ...之后发生的事情。
- loading phase 加载阶段
bazel遍历当前工程下,所有子文件夹,找到其中的BUILD文件,加载外部依赖,生成一个个package和target。 - analysis phase 分析阶段
根据各个BUILD中定义的目标和输入输出信息,建立一个内存中的build graph。 - executing phase 执行阶段
根据build graph逐个运行各个规则定义的动作,产生最终的目标。
基础了解以后,下一篇将实例说明如何将现有的一个makefile工程转换到bazel 。
bazel 简介(一)—— 基础概念与原理的更多相关文章
- 【k8s】基础概念 + 工作原理
工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...
- Zookeeper与Kafka基础概念和原理
1.zookeeper概念介绍 在介绍ZooKeeper之前,先来介绍一下分布式协调技术,所谓分布式协调技术主要是用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种共享资源,防止造成 ...
- JNI基础概念以及原理-2016.01.11
Java到C数据类型转换 1 基础类型 Java与Jni类型对应关系 2 String到char数组 具体使用方式 JNIEXPORT jstring JNICALL Java_com_zhoulee ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- zabbix监控的基础概念、工作原理及架构(一)
zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...
- Spark集群基础概念 与 spark架构原理
一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
- nginx架构与基础概念
1 Nginx架构 Nginx 高性能,与其架构有关. Nginx架构: nginx运行时,在unix系统中以daemon形式在后台运行,后台进程包含一个master进程和多个worker ...
- [转帖]从0开始的高并发(一)--- Zookeeper的基础概念
从0开始的高并发(一)--- Zookeeper的基础概念 https://juejin.im/post/5d0bd358e51d45105e0212db 前言 前面几篇以spring作为主题也是有些 ...
- Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
随机推荐
- Centos编译加载toa模块
什么是toa模块 toa模块是为了让后端的realserver能够看到真实的clientip而不是lvs的dip 安装步骤 安装依赖包 yum -y install kernel-devel gcc ...
- 02-HTML知识点
01 元素的介绍 02 元素的属性 03 元素的嵌套关系 04 HTML结构分析 4.1 文档声明[这个不叫元素] 4.2 html元素 4.3 head元素 主要用来写文档的配置信息 05 HTML ...
- do{}while0的两个作用
1.作为一种防止宏错误展开的一种防御性写法. 相信很多人都知道,这里不展开了. 2.实现 goto 语句的功能,一次break就可以跳出到后续语句. do { if(...) break; ... } ...
- 静态 top tree 入门
理论 我们需要一个数据结构维护树上的问题,仿照序列上的问题,我们需要一个方法快速的刻画出信息. 比如说线段树就通过分治的方式来通过将一个区间划分成 \(\log n\) 个区间并刻画出这 \(\log ...
- 工控CTF_Modbus TCP
工控CTF_Modbus TCP 参考文章 https://blog.csdn.net/song123sh/article/details/128387982 https://www.anquanke ...
- java将list中某个元素放在首位
java将list中某个元素放在首位 1 List<Example> example = exampleRepository.list(); 2 3 //将list里的某个字符串默认排列在 ...
- P2918
[USACO08NOV]Buying Hay S 题意描述 约翰的干草库存已经告罄,他打算为奶牛们采购 H(1 \leq H \leq 50000)H(1≤H≤50000) 磅干草. 他知道 N(1 ...
- 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?
1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...
- 靶机: EvilBox---One
靶机: EvilBox---One 准备工作 靶机地址: https://download.vulnhub.com/evilbox/EvilBox---One.ova MD5 校验:c3a65197b ...
- OpenGL之ShadowMap
流程:先创建一个RenderTexture,然后用灯光的视口渲染. 然后切换到正常相机,进行渲染,使用RenderTexture中的深度或者颜色纹理,然后还原当前顶点在灯光中的深度,两者对比,比缓存中 ...