0x01 背景

bazel目前已广泛用于云计算领域的开源软件的构建如k8s、kubevirt等,本文以一个新手的角度分享下bazel的基础知识,其存在的价值。对比下,它与其他已经存在的构建系统的差别,以及它适用于什么场景。

0x02 构建系统

构建对应的英文是BUILD,也就是大家所说的编译打包,就是将编写出的代码经过编译器处理,产生二进制,形成一个可以正常运行的软件包(如deb或者rpm)。对于编译型语言来说,构建几乎是日常工作的一部分。

  1. 是一个辅助过程,它本身不产生价值。
  2. 又是必须的一个过程,没有它CI是空谈。

基于这两个特点来说,我们希望理想的构建系统具备以下特点:

  1. 尽可能地快。可以方便开发人员,编写代码后快速出包验证改动。
  2. 方便维护,可以清晰地展示依赖关系,在系统中添加一个模块,或者减少一个模块,可以非常容易维护。

对比理想系统,我们看下构建技术的发民。软件构建技术的发展和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开源的构建工具。它通过将构建过程进行抽象建模,实现了一个接近理解的构建系统。

  1. 快速构建。

    bazel支持增量式编译,支持缓存,支持分布式扩展。这3点就可以满足快速建构。只要有投入足够多的硬件资源,你的构建就可以很快。
  2. 清晰的依赖关系。

    虽然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 ...之后发生的事情。

  1. loading phase 加载阶段

    bazel遍历当前工程下,所有子文件夹,找到其中的BUILD文件,加载外部依赖,生成一个个package和target。
  2. analysis phase 分析阶段

    根据各个BUILD中定义的目标和输入输出信息,建立一个内存中的build graph。
  3. executing phase 执行阶段

    根据build graph逐个运行各个规则定义的动作,产生最终的目标。

基础了解以后,下一篇将实例说明如何将现有的一个makefile工程转换到bazel 。

bazel 简介(一)—— 基础概念与原理的更多相关文章

  1. 【k8s】基础概念 + 工作原理

    工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...

  2. Zookeeper与Kafka基础概念和原理

    1.zookeeper概念介绍 在介绍ZooKeeper之前,先来介绍一下分布式协调技术,所谓分布式协调技术主要是用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种共享资源,防止造成 ...

  3. JNI基础概念以及原理-2016.01.11

    Java到C数据类型转换 1 基础类型 Java与Jni类型对应关系 2 String到char数组 具体使用方式 JNIEXPORT jstring JNICALL Java_com_zhoulee ...

  4. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  5. zabbix监控的基础概念、工作原理及架构(一)

    zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...

  6. Spark集群基础概念 与 spark架构原理

    一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...

  7. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  8. nginx架构与基础概念

    1       Nginx架构 Nginx 高性能,与其架构有关. Nginx架构: nginx运行时,在unix系统中以daemon形式在后台运行,后台进程包含一个master进程和多个worker ...

  9. [转帖]从0开始的高并发(一)--- Zookeeper的基础概念

    从0开始的高并发(一)--- Zookeeper的基础概念 https://juejin.im/post/5d0bd358e51d45105e0212db 前言 前面几篇以spring作为主题也是有些 ...

  10. Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

    ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

随机推荐

  1. Go1.13的坑:无法结束Goroutine

    背景 本人作为一名SRE,想用Go模拟Cpu占用100% 1秒钟,但是在Go1.13上遇到了问题,1s后Goroutine不会停止. 只要用了for{},Goroutine就无法结束,即使主Gorou ...

  2. NVIDIA Jetson AGX Xavier 从刷机之后到配置环境

    特殊的配置环境需求: cuda-10.2.python 3.6.9.torch 1.7.0.torchversion 0.8.1,剩下的顺其自然即可(逃. 顺便说一句,里面的指令请一行一行仔细复制粘贴 ...

  3. 手机护眼概论及OLED屏幕降低频闪原理介绍

    影响护眼的因素 蓝光 目前手机大多已经实现硬件低蓝光,而且蓝光也可以通过护眼模式轻易克服. 偏振光 偏振光指振动方向与传播方向不对称的光,主要分为圆偏振光与线偏振光两种. 线偏振光测试方法为:透过偏振 ...

  4. 🚀 Karpor - 让 AI 全面赋能 Kubernetes!

    什么是 Karpor? 一言以蔽之,Karpor 是一个现代化的 Kubernetes 可视化工具,核心特性聚焦在  搜索. 洞察. AI ,目标是更方便快捷地连接平台和多集群,并用 AI 赋能 Ku ...

  5. 在OwinSelfHost项目中获取客户端IP地址

    在OwinSelfHost项目中,获取客户端的IP地址可以通过以下方法获得: base.Request.GetOwinContext().Request.RemoteIpAddress 创建一个Owi ...

  6. 几个适合Java开发者的免费IDEA插件

    今天,给大家推荐几个好用且免费的IntelliJ IDEA插件.如果你还没有用过,可以尝试一下,也许对你的日常工作会有一定的效率提升噢! RestFulTool 如果你是一个RESTful服务的开发者 ...

  7. CF709B 题解

    洛谷链接&CF 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\) 个点,在一条数轴上,位置为 \(x_1,-,x_n\),你的位置为 \(p\) ...

  8. VSCode最强插件推荐(持续更新)

    一.通用插件 Codelf 描述:变量命名神器 Bracket Pair Colorizer 描述:成对的彩色括号,让括号拥有独立的颜色,便于区分 Prettier - Code formatter ...

  9. SUM-ACM——VJ天梯训练赛

    这次比赛我暴露了很多问题,一些模拟还有贪心思路错误. 补题如下: E - E 题解:一道模拟题,我的问题在于不知道怎么替换下一个,就从0开始遍历数组然后数组的值--,如果为零就continue下一个, ...

  10. Django 跨域访问POST请求需预先发送option请求问题处理方案

    跨域访问POST请求需预先发送option请求问题处理方案   By:授客 QQ:103355122 实践环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下 ...