当前位置: 首页 > news >正文

bazel构建原理

调度模型

传统构建系统有很多是基于任务的,例如 Ant,Maven,Gradle。用户可以自定义"任务"(Task),例如执行一段 shell 脚本。用户配置它们的依赖关系,构建系统则按照顺序调度。

基于 Task 的调度模型

这种模式对使用者很友好,他可以专注任务的定义,而不用关心复杂的调度逻辑。构建系统通常给予任务制定者极大的"权利",比如 Gradle 允许用户用 Java 代码编写任务,原则上可以做任何事。

如果一个任务,在输入条件不变的情况下,永远输出相同的结果,我们就认为这个任务是"封闭"(Hermeticity) 的。构建系统可以利用封闭性提升构建效率,例如第二次构建时,跳过某些输入没变的 Task,这种方式也称为 增量构建

不满足封闭性的任务,则会导致增量构建失效,例如 Task 访问某个互联网资源,或者 Task 在执行时依赖随机数或时间戳这样的动态特征,这些都会导致多次执行 Task 得到不同的结果。

Bazel 采用了不同的调度模型,它是基于目标Target【制品 (Artifact) 的】。Bazel 官方定义了一些规则 (rule),用于构建某些特定产物,例如 c++ 的 library 或者 go 语言的 package,用户配置和调用这些规则。他仅仅需要告诉 Bazel 要构建什么 target,而由 Bazel 来决定如何构建它。

规则由官方和可信赖第三方维护,规则产生的任务,满足封闭性需求,这使得用户可以信赖系统的增量构建能力。

bazel基于 Target 的调度模型如下图所示:

基于 Target 的调度模型

File 表示原始文件,Target 表示构建时生成的文件。当用户告诉 Bazel 要构建某个 Target 的时候,Bazel 会分析这个文件如何构建(构建动作定义为 Action,和其他构建系统的 Task 大同小异),如果 Target 依赖了其他 Target,Bazel 会进一步分析依赖的 Target 又是如何构建生成的,这样一层层分析下去,最终绘制出完整的执行计划。

并行编译

Bazel 精准的知道每个 Action 依赖哪些文件,这使得没有相互依赖关系的 Action 可以并行执行,而不用担心竞争问题。基于任务的构建系统则存在这样的问题:

基于任务的构建系统存在竞争问题

两个 Task 都会向同一个文件写一行字符串,这就造成两个 Task 的执行顺序会影响最终的结果。要想得到稳定的结果,就需要定义这两个 Task 之间的依赖关系。

Bazel 的 Action 由构建系统本身设计,更加安全,也不会出现类似的竞争问题。因此我们可以充分利用多核 CPU 的特性,让 Action 并行执行。

通常我们采用 CPU 逻辑核心数作为 Action 执行的并发度,如果开启了远端执行 (后面会提到),则可以开启更高的并发度。

增量编译

Bazel 将构建拆分为独立的步骤,这些步骤称为操作(Action)。每项操作都有输入、输出名称、命令行和环境变量。系统会为每个操作明确声明所需的输入和预期输出。

对 Bazel 来说,每个 Target 的构建过程,都对应若干 Action 的执行。Action 的执行本质上就是"输入文件 + 编译命令 + 环境信息 = 输出文件"的过程。

Action 的描述

如果本地文件系统保留着上一次构建的 outputs,此时 Bazel 只需要分析 inputs, commands 和 envs 和上次相比有没有改变,没有改变就直接跳过该 Action 的执行。

这对于本地开发非常有用,如果你只修改了少量代码,Bazel 会自动分析哪些 Action 的 inputs 发生了变化,并只构建这些 Action,整体的构建时间会非常快。

不过增量构建并不是 Bazel 独有的能力,大部分的构建系统都具备。但对于几万个文件的大型工程,如果不修改一行代码,只有 Bazel 能在一秒以内构建完毕,其他系统都至少需要几十秒的时间,这简直就是 降维打击 了。

Bazel 是如何做到的呢?

首先,Bazel 采用了 Client/Server 架构,当用户键入 bazel build 命令时,调用的是 bazel 的 client 工具,而 client 会拉起 server,并通过 grpc 协议将请求 (buildRequest) 发送给它。由 server 负责配置的加载,ActionGraph 的生成和执行。

Bazel 的 C/S 架构

构建结束后,Server 并不会立即销毁,而 ActionGraph 也会一直保存在内存中。当用户第二次发起构建时,Bazel 会检测工作空间的哪些文件发生了改变,并更新 ActionGraph。如果没有文件改变,就会直接复用上一次的 ActionGraph 进行分析。

这个分析过程完全在内存中完成,所以如果整个工程无需重新构建,即便是几万个 Action,也能在一秒以内分析完毕。而其他系统,至少需要花费几十秒的时间来重新构建 ActionGraph。

本文属于如下文章中的子章节

bazel学习系列章节汇总_m0_74043383的博客-CSDN博客

相关文章:

bazel构建原理

调度模型 传统构建系统有很多是基于任务的,例如 Ant,Maven,Gradle。用户可以自定义"任务"(Task),例如执行一段 shell 脚本。用户配置它们的依赖关系,构建系统则按照顺序调度。 基于 Task 的调度…...

matlab 点云的二进制形状描述子

目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接本文由CSDN点云侠原创,...

MongoDB实验——在Java应用程序中操作 MongoDB 数据

在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库,使用root账户 3.开启Eclipse,创建Java Project项目,命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包,包名为mo…...

java+springboot+mysql校园跑腿管理系统

项目介绍: 使用javaspringbootmysql开发的校园跑腿管理系统,系统包含超级管理员,系统管理员、用户角色,功能如下: 超级管理员:管理员管理;用户管理(充值);任…...

ubuntu20.04 server 安装后磁盘空间只有一半的处理

这里扩展:/dev/mapper/ubuntu–vg-ubuntu–lv rootbook:/data# df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 795M 1.2M 79…...

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最好最适合的模型,成了很多人头疼的问题由于用的大部分都是1.5的模型,所以优先下载 safete…...

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB

一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法(multi-objective artificial hummingbird algorithm&…...

【HTML5】HTML5 特性

HTML5 特性 1. 语义化标签 <header>&#xff1a;表示网页或某个区域的页眉部分&#xff0c;通常包含网站的标志、导航菜单等内容。<nav>&#xff1a;表示导航区域&#xff0c;用于包含网站的主要导航链接。<main>&#xff1a;表示网页的主要内容区域&#…...

【FreeRTOS】互斥量的使用与逐步实现

在FreeRTOS中&#xff0c;互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式&#xff0c;确保在任意时刻只有一个任务可以获取互斥量并访问共享资源&#xff0c;其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…...

Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递 微服务系统中&#xff0c;前端会携带登录生成的token访问后端接口&#xff0c;请求会首先到达网关&#xff0c;网关一般会做token解析&#xff0c;然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务&#xff0c;微服务中会有拦截器来做用户信息的…...

OpenCV(十一):图像仿射变换

目录 1.图像仿射变换介绍 仿射变换&#xff1a; 仿射变换矩阵&#xff1a; 仿射变换公式&#xff1a; 2.仿射变换函数 仿射变换函数&#xff1a;warpAffine() 图像旋转&#xff1a;getRotationMatrix2D() 计算仿射变换矩阵&#xff1a;getAffineTransform() 3.demo 1.…...

多路波形发生器的控制

本次波形发生器&#xff0c;主要使用运算放大器、NE555以及一些其他的电阻电容器件来实现。整体电路图如下所示&#xff1a; 产生的三角波如下&#xff1a; 正弦波如下 方波如下&#xff1a; 运算放大器&#xff08;Operational Amplifier&#xff0c;简称OP-AMP&#xff09;是…...

[C/C++]天天酷跑超详细教程-中篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…...

面试被打脸,数据结构底层都不知道么--回去等通知吧

数据结构之常见的8种数据结构&#xff1a; -数组Array -链表 Linked List -堆 heap -栈 stack -队列 Queue -树 Tree -散列表 Hash -图 Graph 数据结构-链表篇 Linklist定义&#xff1a; -是一种线性表&#xff0c;并不会按线性的顺序存储数据&#xff0c;即逻辑上相邻…...

微服务面试问题小结( 微服务、分布式、MQ、网关、zookeeper、nginx)

什么是微服务&#xff0c;单体架构的优点和缺点&#xff0c;微服务架构的优点和缺点&#xff1f; 单体架构 优点&#xff1a;架构简单&#xff0c;维护成本低缺点&#xff1a;各个模块耦合度太高&#xff0c;当对一个模块进行更新修改时&#xff0c;会影响到其他模块&#xff…...

Vue3全局变量使用

全局变量&#xff08;函数等&#xff09;可以在任意组件内访问&#xff0c;可以当组件间的传值使用。 main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vueconst app createApp(App); app.config.globalProperties.$global_id10; app.…...

拼多多海量商品数据接口API 商品详情接口 商品价格主图接口

拼多多&#xff0c;作为中国最大的社交电商之一&#xff0c;提供了丰富的商品信息和海量的用户数据。对于广大开发者而言&#xff0c;如何快速、准确地获取这些数据&#xff0c;进而开发出各种创新应用&#xff0c;是他们关心的问题。本文将详细介绍拼多多海量商品数据接口API的…...

结构化日志记录增强网络安全性

日志是一种宝贵的资产&#xff0c;在监视和分析应用程序或组织的 IT 基础结构的整体安全状况和性能方面发挥着至关重要的作用。它们提供系统事件、用户活动、网络流量和应用程序行为的详细记录&#xff0c;从而深入了解潜在威胁或未经授权的访问尝试。虽然组织历来依赖于传统的…...

企业架构LNMP学习笔记5

Nginx&#xff1a; 常见用法&#xff1a; 1&#xff09;web服务器软件 httpd http协议 同类的web服务器软件&#xff1a;apache Nginx&#xff08;俄罗斯&#xff09;IIS&#xff08;微软&#xff09;lighttpd&#xff08;德国&#xff09; 2&#xff09;代理服务器 反向代…...

Idea安装免注册版ChatGPT

文章目录 一、前期准备二、开始使用 一、前期准备 1.准备Idea开发软件并打开&#xff08;VS Code同理&#xff09;! 2.【CtrlAltS】快捷键调出Settings窗口&#xff0c;如图 3.找到NexChatGPT 此插件不需要注册&#xff0c;可以直接使用&#xff08;高级一些的需要会员收费限…...

在对话中处理数学方程时,OpenClaw 的 LaTeX 渲染引擎支持哪些宏包?

在讨论OpenClaw的LaTeX渲染能力时&#xff0c;很多人会直接去翻官方文档或者技术手册。但如果你真的在项目里用过它&#xff0c;尤其是处理过那些复杂的数学对话场景&#xff0c;就会发现文档里写的东西和实际能用的东西&#xff0c;中间往往隔着一层实践的距离。 OpenClaw在设…...

终极内存故障排查方案:Memtest86+完整应用指南

终极内存故障排查方案&#xff1a;Memtest86完整应用指南 【免费下载链接】memtest86plus memtest86plus: 一个独立的内存测试工具&#xff0c;用于x86和x86-64架构的计算机&#xff0c;提供比BIOS内存测试更全面的检查。 项目地址: https://gitcode.com/gh_mirrors/me/memte…...

FastAPI API版本控制:URI前缀的终极实现指南

FastAPI API版本控制&#xff1a;URI前缀的终极实现指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI是一个高性能、易于学习…...

蓝牙UUID:从标准服务到自定义通信的密钥

1. 蓝牙UUID&#xff1a;智能设备的身份证 想象一下你走进一个满是蓝牙设备的房间——智能手环在测量心率&#xff0c;温湿度计在报告数据&#xff0c;智能灯泡等待你的指令。这些设备如何知道该响应哪个请求&#xff1f;答案就藏在那个128位的UUID&#xff08;通用唯一识别码…...

OpenClaw长期运行方案:nanobot镜像的稳定性优化技巧

OpenClaw长期运行方案&#xff1a;nanobot镜像的稳定性优化技巧 1. 为什么需要关注长期运行稳定性 去年冬天&#xff0c;我部署了一个基于OpenClaw的自动化新闻摘要系统。最初几周运行良好&#xff0c;直到某个凌晨收到服务器告警——进程已经悄悄崩溃了三天。这次教训让我意…...

开源ERP新选择:Odoo如何助力钢铁冶金企业实现数字化转型

Odoo开源ERP&#xff1a;钢铁冶金企业数字化转型的模块化引擎 钢铁冶金行业正面临前所未有的转型压力——从环保合规到供应链波动&#xff0c;从劳动力成本上升到全球化竞争。在这个背景下&#xff0c;一套既能快速响应业务变化又能控制成本的ERP系统不再是奢侈品&#xff0c;…...

突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册

突破性Unity游戏插件框架实战指南&#xff1a;BepInEx从零到精通的完全手册 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的革命性插件框架&…...

为什么选择yfinance:3步实现免费金融数据获取的完整解决方案

为什么选择yfinance&#xff1a;3步实现免费金融数据获取的完整解决方案 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 在金融数据分析的世界里&#xff0c;你是否曾为获取高质…...

造相-Z-Image实战案例:4步生成写实质感人像,RTX 4090低步高效实测

造相-Z-Image实战案例&#xff1a;4步生成写实质感人像&#xff0c;RTX 4090低步高效实测 1. 项目简介 造相-Z-Image是一个专门为RTX 4090显卡优化的本地文生图系统&#xff0c;基于通义千问官方的Z-Image模型打造。这个项目最大的特点就是完全针对个人显卡进行深度优化&…...

playwright-skill解决Web自动化登录难题:从表单交互到会话持久化

playwright-skill解决Web自动化登录难题&#xff1a;从表单交互到会话持久化 【免费下载链接】playwright-skill Claude Code Skill for browser automation with Playwright. Model-invoked - Claude autonomously writes and executes custom automation for testing and val…...