bazel基础知识

news2024/10/1 5:34:05

ABOUT BAZEL

什么是Bazel?

  • 构建系统,而不是构建生成器(直接调用编译器)【A build system, not a build generator (invokes directly the compiler)】

  • 具有完整的测试功能(测试报告、片状测试处理等)【With full of functionality for testing (test reports, flaky tests handling, etc.)】

  • Bazel核心是用Java编写的,规则和宏是用Starlark编写的【Bazel core is written in Java, rules and macros written in Starlark】

历史-从Blaze到Bazel

  • Blaze是谷歌的构建系统(开发始于2007年左右)
  • Blaze的一部分于2015年作为Bazel开源【Part of Blaze was open sourced on 2015 as Bazel】
  • 它于2019年10月从测试版转向普遍可用性

发布过程

  • 自通用可用性发布以来,Bazel遵循语义版本【Since the general availability release, Bazel follows semantic versioning】
  • 主要版本之间至少3个月
  • 每月发布基于GitHub HEAD的小版本
  • 长期支持(LTS)从Bazel 4.0(2020年12月)开始,每9个月将提供一次新的LTS版本【Long Term Support (LTS) starting from Bazel 4.0 (December 2020), a new LTS release will be provided every 9 months】
    • https://blog.bazel.build/2020/11/10/long-term-support-release.html

https://docs.bazel.build/

BAZEL FEATURES

快速且正确

  • 增量构建和测试执行【Incremental builds and test execution】
  • 并行执行
  • 本地和远程缓存【Local and remote cache】
  • 由于沙盒,密封构建【Hermetic builds thanks to sandboxing】

多语言,多平台

  • Java、C/C++、Android、iOS、Go、Python等。
  • Linux、Windows和macOS

可伸缩的【Scalable】

  • 它可以处理任何大小的代码库【It can handle codebases of any size】
  • 多个存储库或巨大的单核存储库,它同时处理两者【Multiple repositories or huge monorepo , it handles both】

可扩展的【Extensible】

  • 如果不支持平台或语言,可以轻松添加
  • 扩展是用Skylark编写的,这是一种类似于Python的语言【Extensions are written in Skylark, a language similar to Python】

https://docs.bazel.build/versions/3.7.0/bazel-overview.html#why-should-i-use-bazel

BAZEL IN A NUTSHELL

在这里插入图片描述

这是一个基于工件的系统【It is an artifact based system】

  • 输入被视为工件
  • 输出被视为工件
  • 行动也被视为人工制品【Actions are treated as artifacts as well】
  • 对于每个工件,都可以提前计算散列,以允许缓存【For every artifact a hash can be computed in advance to allow caching】

每个动作都在沙盒上运行

  • 提高可重现性【Improving reproducibility】
  • 更好地检测未声明的依赖项

可组合性

  • 一个动作的输出可以用作另一个动作的输入【Outputs of an action can be used as inputs of another action】
  • 一个动作可以是另一个动作的输出【An action can be the output of another action】

BAZEL DESIGN

客户端/服务器架构【Client/server architecture】

  • 首次执行Bazel命令时,将启动Bazel服务器
  • Bazel命令完成后,服务器继续运行
  • 以下命令使用已运行的服务器执行【The following commands executed use the already running server】
  • 两个Bazel客户端不能并行运行(例外)【Two Bazel clients cannot run in parallel (with exception)】
  • Bazel服务器可以通过bazel shutdown来停止
  • 此架构允许服务器缓存信息【This architecture allows the server to cache information】

在这里插入图片描述

BAZEL FILES

在这里插入图片描述

工作空间【WORKSPACE】

  • 在您想要构建的源代码的根部【At the root of the source code that you want to build】
  • 它可能是空的
  • 用于声明外部依赖项【Used to declare external dependencies】

BUILD

  • 在package的根部【At the root of a package】
  • 软件包由所有文件、文件夹和子文件夹定义,与BUILD文件相同级别,但包含BUILD文件的文件除外【A package is defined by all files, folders, and subfolders at the same level like the BUILD file except the ones that contain a BUILD file】
  • 定义目标的地方【Where targets are defined】

*.bzl

  • 用于定义Bazel扩展【Use to define Bazel extensions】
  • 它们可以使用load语句加载到BUILD或WORKSPACE文件中【They can be loaded in a BUILD or WORKSPACE file using the load statement】

BAZEL LABELS

在这里插入图片描述

@repository//folder/subfolder:my_target

省略存储库假设当前存储库:

@repository//folder/subfolder:my_target
//folder/subfolder:my_target

省略冒号的名称与文件夹相同【Omitting the colon assumes the same name like the folder】:

//lib:lib
//lib

从同一BUILD文件中的lib的冒号搜索开始【Starting with colon search for lib in the same BUILD file】

:lib

From the same or another file:

在这里插入图片描述

@example//client:small_client
//client:small_client
@example//client:client
@example//client
//client:client
//client

从同一个BUILD文件中

From the same BUILD file:
:client
:small_client

TARGET VISIBILITY

在这里插入图片描述

Private: Visible only from the same BUILD file

visibility:private

Public: Anyone can see this target

visibility:public

Visible by a specific package and subpackages

//foo/bar:__subpackages__

Visible by a specific package but not subpackages

//foo/bar::__pkg__

可见性可以按包、每个目标或两者定义【Visibility can be defined per package, per target or both】

默认情况下,目标可见性与软件包相同【By default the target visibility is the same like the package】

如果未定义可见性,则目标仅在BUILD文件中可见【If visibility is not defined, a target is only visible within the BUILD file】

https://docs.bazel.build/versions/3.7.0/visibility.html

PHASES OF A BUILD

加载阶段【Loading phase】

  • 加载扩展、BULD文件、传递依赖项【Load extensions, BULD files, transitive dependencies】
  • 持续时间:第一次几秒钟,之后由于缓存而更快【Duration: Several seconds the first time, faster afterwards thanks to caching】

分析阶段

  • 每条规则的语义分析【Semantic analysis of each rule】
  • 构建依赖图
  • 分析需要完成的工作【Analyze what work needs to be done】
  • 持续时间:第一次几秒钟,之后由于缓存而更快【Duration: Several seconds the first time, faster afterwards thanks to caching】

执行阶段

  • 构建目标:编译、链接等。
  • 执行目标、运行测试等。【Execution of targets, tests running, etc.】
  • 持续时间:大部分时间都花在执行阶段,由于缓存,也可以加快速度【Duration: Most of the time is spend in the execution phase, also can be speeded up thanks to caching】

https://docs.bazel.build/versions/3.7.0/guide.html#phases-of-a-build

BAZEL CACHE

Bazel提供四个不同级别的缓存

  • 在内存缓存中(Bazel服务器)【In memory cache ( Bazel server)】

    • Bazel服务器停止后丢失/清理
  • 输出目录(bazel-out)

    • 工作区本地【Local to the workspace】
    • 可以用bazel clean和bazel clean --expunge来去除
  • 磁盘缓存(本地机器中的文件夹)【Disk cache (folder in local machine)】

    • 切换分支时共享工件很有用
    • 如果您有同一项目的多个工作区/checkout,则非常有用【Useful if you have multiple workspaces/checkouts of the same project】
    • 它可以让你的磁盘使用量增加很多
  • 远程缓存(HTTP/1.1服务器)

    • 有助于在团队成员之间或与CI共享工件

https://docs.bazel.build/versions/3.7.0/remote-caching.html

Bazel缓存“总是”有效且正确

  • 删除缓存的唯一原因是释放空间
  • 每次你解决bazel clean的问题时,都应该创建一个错误票
    • 它可能是Bazel核心:
      • https://github.com/bazelbuild/bazel/issues
    • 这可能是一些Bazel规则:
      • https://github.com/bazelbuild/rules_go/issues
      • https://github.com/bazelbuild/rules_python
      • https://github.com/bazelbuild/rules_docker
    • 它可能在您的工具链配置之一中
    • 它可能在你的一个Bazel扩展中【It might be in one of your Bazel extensions】

BAZEL LOCAL CACHE SETUP

Common setup:

在这里插入图片描述

BAZEL REMOTE CACHE SETUP

Recommended by Bazel:

  • CI read and write, developers read only
    在这里插入图片描述
    https://archive.fosdem.org/2018/schedule/event/datacenter_build/

更分散的方法:【A more distributed approach:】

  • 每个开发人员团队一个远程缓存【One remote cache per developer team】
  • 仅适用于CI的一个远程缓存【One remote cache for CI only】
  • 在每个远程缓存上,一个实体向其写入【On each remote cache one single entity writes to it】
  • 此外,每个开发人员都使用磁盘缓存【In addition each developer uses disk cache】
    在这里插入图片描述
    在这里插入图片描述

BAZEL REMOTE EXECUTION

Bazel, compilation, and execution can run in different machines

在这里插入图片描述
https://docs.bazel.build/versions/3.7.0/remote-execution.html

BAZEL FOR C++ AND PYTHON

在这里插入图片描述

BUILD SYSTEM FOR PYTHON?

在这里插入图片描述

  • 更难通过沙盒泄露依赖项
  • 跨语言运行目标的统一方式
  • 您从Bazel测试实用程序中受益
  • 除了bazel构建,你仍然需要所有其余的

C++ EXAMPLE WITH BAZEL

在这里插入图片描述
https://github.com/limdor/bazel-examples/tree/master/cpp

在这里插入图片描述

PYTHON EXAMPLE WITH BAZEL

在这里插入图片描述

在这里插入图片描述
https://github.com/limdor/bazel-examples/tree/master/python

COMPILE C++ CODE GENERATED WITH PYTHON

在这里插入图片描述
https://github.com/limdor/bazel-examples/tree/master/cpp_and_python
在这里插入图片描述
https://github.com/limdor/bazel-examples/tree/master/cpp_and_python

在这里插入图片描述

BAZEL TOOLCHAINS

等等!如果它如此密封,为什么我们不必指定我们的编译器?【Wait! If it is so hermetic, why we did not have to specify our compiler?】

  • 出于实际原因,Bazel提供了一些预定义的工具链,如果在您的机器中安装了一些编译器,可以使用这些工具链
  • 选项–toolchain_resolution_debug可用于查看正在使用哪些工具链
    • 选定的工具链 @local_config_cc//:cc-compiler-k8【Selected toolchain @local_config_cc//:cc compiler k8】
  • 对于任何生产项目,您都应该定义一个密封的工具链
    • 如果工具链指向本地安装的编译器,那么定义工具链是不够的
    • 编译器和链接器应该像任何输入工件一样提供
    • 应该像任何输入工件一样提供Python解释器
    • 如果用户需要在Bazel之外的机器上安装一些东西,你做错了什么【If a user needs to install something in his machine apart from Bazel , you are doing something wrong】
  • Bazel提供了许多关于如何定义工具链的文档
    • https://docs.bazel.build/versions/3.7.0/tutorial/cc-toolchain-config.html
    • https://docs.bazel.build/versions/3.7.0/toolchains.html

https://docs.bazel.build/versions/master/tutorial/cc-toolchain-config.html

BAZEL TEST RUNNER

在这里插入图片描述
在这里插入图片描述
https://docs.bazel.build/versions/3.7.0/test-encyclopedia.html

BAZEL TEST RUNNER

在这里插入图片描述

BAZEL COVERAGE

在这里插入图片描述
https://github.com/limdor/bazel-examples/tree/master/cpp_coverage

BAZEL QUERY

在这里插入图片描述
https://docs.bazel.build/versions/3.7.0/query-how-to.html

BAZELISK

在这里插入图片描述
https://github.com/bazelbuild/bazelisk

在这里插入图片描述
https://docs.bazel.build/versions/3.7.0/skylark/aspects.html

在这里插入图片描述
在这里插入图片描述

WORKSPACE+BUILD

如下图:每个bazel工程建立在git 仓库中,外部依赖通过WORKSPACE定义,BUILD定义目标的依赖关系。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯又一平台即将停止运营

随着腾讯公司业务和战略的调整,某些业务逐渐退出历史舞台,如“腾讯直播平台NOW”,以及“QQ签到”,“腾讯待办”,“企鹅FM音频平台”等,最近又有一则重磅消息,那就是“腾讯课堂”也即将停止运营。…

【Linux】进程(9):进程控制2(进程等待)

大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制2,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 为什么要进程等待二. 如何进行进程等待1.wait函数—…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求,尤其是在技术行业中,实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

设计无缝体验:交互设计流程全解析

完整的产品交互设计流程是什么?完整的产品交互设计流程包括研究用户需求、指定信息架构、制作产品原型、进行用户测试和实时发布产品。交互设计就是从人与产品之间的关系入手,通过产品设计来满足大众的日常需求。随着网络技术的流行,产品交互…

高性能Python网络框架实现网络应用详解

概要 Python作为一种广泛使用的编程语言,其简洁易读的语法和强大的生态系统,使得它在Web开发领域占据重要位置。高性能的网络框架是构建高效网络应用的关键因素之一。本文将介绍几个高性能的Python网络框架,详细描述它们的特点、使用场景及具体示例代码,帮助高效实现网络应…

鸿蒙语言基础类库:【@ohos.util.ArrayList (线性容器ArrayList)】

线性容器ArrayList 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽,并尽快将未使用的带宽返回到可用带宽池。 在这里,我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps,这分别对应高速、全速、低速…

Mysql 高性能索引

引言 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 常见的索引类型包括B-Tree索引、哈希索引、空间数据索引(R-Tree)、全文索引。 索引的类型 在MySQL中,索引是在 存储引擎层 而不是服…

分享五款软件,成为高效生活的好助手

​ 给大家分享一些优秀的软件工具,是一件让人很愉悦的事情,今天继续带来5款优质软件。 1.图片放大——Bigjpg ​ Bigjpg是一款图片放大软件,采用先进的AI算法,能够在不损失图片质量的前提下,将低分辨率图片放大至所需尺寸。无论…

C 语言中如何进行冒泡排序?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…

cesium 雷达扫描

cesium 雷达扫描 (下面附有源码) 实现思路 1、通过改变圆型材质来实现效果, 2、用了模运算和步进函数(step)来创建一个重复的圆形图案 3、当纹理坐标st落在垂直或水平的中心线上时,该代码将改变透明度和颜色,以突出显示这些线 示例代码 <!DOCTYPE html> <ht…

python开发prometheus exporter--用于hadoop-yarn监控

首先写python的exporter需要知道Prometheus提供4种类型Metrics 分别是&#xff1a;Counter, Gauge, Summary和Histogram * Counter可以增长&#xff0c;并且在程序重启的时候会被重设为0&#xff0c;常被用于任务个数&#xff0c;总处理时间&#xff0c;错误个数等只增不减的指…

【深度学习】LeNet原理及代码实现

目录 1.原理及介绍 2.代码实现 2.1model.py 2.2model_train.py 2.3model.test.py 1.原理及介绍 2.代码实现 2.1model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__…

高智能土壤养分检测仪:农业生产的科技新助力

在科技日新月异的今天&#xff0c;农业领域也迎来了革命性的变革。其中&#xff0c;高智能土壤养分检测仪作为现代农业的科技新助力&#xff0c;正逐渐改变着传统的农业生产方式&#xff0c;为农民带来了前所未有的便利与效益。 高智能土壤养分检测仪&#xff0c;是一款集高科技…

grep对文件内容搜索(附重要拓展-正则表达式)

文件搜索是搜索查找符合条件的某文件的目录&#xff0c;若要编辑文件或对文件的某配置进行修改&#xff0c;就需要对文件内容进行搜索。 grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具&#xff0c;用于搜索一个或多个文件中匹配给定模式的行。grep 代表“Gl…

深入剖析数据库索引

写在前面&#xff1a; 此博客内容已经同步到我的博客网站&#xff0c;如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/database 文章目录 如何验证我们正在使用InnoDB引擎 主键如果你没有自己创建任何主键会发生什么&#xff1f;关键字和索引之间的区别…

基于SpringBoot+Hadoop+python的物品租赁系统(带1w+文档)

基于SpringBootHadooppython的物品租赁系统(带1w文档) 基于SpringBootHadooppython的物品租赁系统(带1w文档) 物品租赁系统是电子、信息技术相结合&#xff0c;是一种必然的发展趋势。以互联网为基础&#xff0c;以服务于广大用户为目的&#xff0c;发展整体优势&#xff0c;扩…

经典双通道比较器LM393、LM393B、LM2903B、LM193、LM293和LM2903介绍及输入输出仿真

前言&#xff1a; LM393 SOP8封装的外观与丝印 LM393出现几十年了&#xff0c;是一款经典的双比较器&#xff0c;非常经典&#xff0c;用的比较多&#xff0c;新的比较器大家也要多关注。 该类型比较器&#xff0c;虽然静态电流较小&#xff0c;但在电池电路中耗电是巨大的&…

学习笔记——动态路由——IS-IS中间系统到中间系统(IS-IS工作过程)

六、IS-IS工作过程 1、第一步&#xff1a;建立邻居关系 IS-IS网络中所有路由器之间实现通信&#xff0c;主要通过以下几个步骤&#xff1a; (1)邻居关系建立&#xff1a; 邻居关系建立主要是通过HELLO包交互并协商各种参数&#xff0c;包括链路类型(level-1/level-2)&#…

hdfs大规模数据存储底层原理详解(第31天)

系列文章目录 一、HDFS设计原理 二、HDFS系统架构 三、HDFS关键技术 四、HDFS应用实例 五、解决HDFS不能处理小文件详解问题 文章目录 系列文章目录前言一、设计原理二、系统架构三、关键技术四、应用实例五、解决HDFS不能处理小文件详解问题1. 合并小文件2. 优化Hive配置3. 使…