【bazel】bazel简介及简单使用

文章目录

  • 1. What is bazel?
  • 2. bazel的核心原理
    • 2.1 bazel的构建模型
    • 2.2 bazel的核心概念
    • 2.3 bazel的关键特性
  • 3. bazel的使用
    • 3.1 划分项目结构
    • 3.2 编写BUILD文件
    • 3.3 bazel常用命令
    • 3.4 bazel依赖管理
  • 参考内容

1. What is bazel?

bazel是一个开源的构建工具,它基于声明式构建语言和精确的依赖管理,一般大型项目的构建会使用bazel。

2. bazel的核心原理

2.1 bazel的构建模型

  • 依赖图DAG:bazel基于依赖图构建。bazel将构建过程建模为有向无环图,每个节点表示一个构建目标(如源文件、库、二进制等),边表示依赖关系。(基于依赖图构建的优势:重构的时候可仅重新构建受影响的节点,实现高效增量构建)
  • 内容寻址存储CAS:每个构件产物(如.o文件)的哈希值由其内容决定,避免重复构建相同内容。
  • 沙箱机制:在隔离环境中执行构建动作(如编译、链接),确保构建过程不受主机环境影响,提升可重现性。

2.2 bazel的核心概念

  • WORKSPACE:WORKSPACE文件一般位于项目的根目录下,用于定义外部依赖和全局配置;
  • BUILD:每个目录下的BUILD文件或BUILD.bazel文件,用于声明本目录的构建目标(如cc_library)
  • Target:目标,是BUILD文件中定义的最小构建单元,比如库、二进制文件等;
  • Rule:规则,用于描述如何从输入(源文件、依赖)生成输出(如编译、打包)。

2.3 bazel的关键特性

  • 增量构建:即仅构建受代码变更影响的目标;
  • 分布式构建:支持将构建任务分发到多台机器(但需要配置远程执行环境);
  • 远程缓存:共享构建缓存,加速团队协作;
  • 跨平台:支持多操作系统,同一构建描述文件可跨平台使用

3. bazel的使用

3.1 划分项目结构

首先需要划分项目结构,确定每个BUILD文件的位置。假设项目结构如下:

my_project/
├── WORKSPACE          # 工作区配置文件(可留空)
├── src/
│   ├── main.c         # 主程序
│   ├── lib/
│   │   ├── utils.c   # 库源码
│   │   └── utils.h
│   └── BUILD         # 构建规则
└── tests/└── test.c        # 测试代码

3.2 编写BUILD文件

示例:

# src/BUILD# 定义静态库
cc_library(name = "utils",           # 目标名称srcs = ["lib/utils.c"],   # 源文件hdrs = ["lib/utils.h"],   # 头文件visibility = ["//visibility:public"],  # 对其他目录可见
)# 定义可执行文件
cc_binary(name = "main",        # 目标名称srcs = ["main.c"],    # 主程序源文件deps = [":utils"],    # 依赖的库
)# 定义测试
cc_test(name = "test_utils",  # 测试目标名称srcs = ["test.c"],    # 测试代码deps = [":utils"],    # 依赖的库
)

3.3 bazel常用命令

  1. 构建目标
    # 示例
    bazel build //src:main # 用于构建src目录下的main目标,在BUILD文件中包含对应的target
    # 命令格式
    bazel build [flags] <targets...>
    # 常用的目标模式
    //src:main # 指定具体目标
    //src/... # src目录下的所有目标
    //... # 整个工作区所有目标
    @repo//path:target # 外部依赖目标
    
  2. 运行程序
    bazel run //src:main # 构建并运行main目标
    
  3. 执行测试
    bazel test //src:test_utils
    
  4. 清理构建缓存
    bazel clean # 清理所有的构建产物
    

3.4 bazel依赖管理

内部依赖:使用//path/to:target语法引用项目内目标;
外部依赖:需要在WORKSPACE文件中声明,并在BUILD文件中使用外部依赖。例如:
当前项目my_project依赖子模块include,include中包含了my_project依赖的头文件,在WORKSPACE中声明:

# new_local_repository规则用于将本地目录或文件引入bazel工作区作为外部依赖;该规则将普通目录转换为bazel仓库
load("@bazel_tools//tools/build_defs/repo:local.bzl", "new_local_repository")
new_local_repository(name = "include" # 仓库名称path = "include" # 绝对路径或相对路径build_file = "include.BUILD" # 可选,指定构建规则文件
)

src/BUILD文件中引用外部依赖:

cc_binary(name = "main",        # 目标名称srcs = ["main.c"],    # 主程序源文件deps = [":utils","@include//:include_headers" # 引用外部依赖。假设include.BUILD中包含了名为include_headers的目标],    
)

参考内容

官方文档: https://bazel.build

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

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

相关文章

【Mytais系列】Myatis的设计模式

目录 设计模式 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 建造者模式&#xff08;Builder Pattern&#xff09; 3. 动态代理模式&#xff08;Dynamic Proxy Pattern&#xff09; 4. 模板方法模式&#xff08;Template Method Pattern&#xff09; 5. 策略模…

【unity游戏开发入门到精通——UGUI】Mask组件实现UGUI遮罩

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言如何实现UI遮罩1、Mask组件2、实例3、注意 专栏推荐完结 前言 Mask遮罩是…

Github2025-05-04php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Shell项目1Vue项目1Java项目1ASP项目1SecLists - 安全测试人员的伴侣 创建周期:4375 天开发语言:PHP协议类型:MIT LicenseStar数量…

MyBatis 一对多与多对一映射详解教程

一、基础概念与场景 一对多&#xff08;One-to-Many&#xff09; • 定义&#xff1a;一个父对象包含多个子对象。 例如&#xff1a;一个商品&#xff08;Goods&#xff09;对应多个商品详情&#xff08;GoodsDetail&#xff09; • 实体类表现&#xff1a;父类中包含 List&l…

ChatGPT:重塑人工智能交互范式的破晓之作

2022年11月30日,总部位于旧金山的研究公司OpenAI正式发布了ChatGPT——一款以病毒式传播速度席卷全球的AI聊天机器人。它不仅能像人类一样生成内容、回答问题和解决问题,更在推出后的两个月内吸引了超过1亿月活跃用户,刷新了消费级技术应用的最快采用率纪录。这一里程碑事件…

在项目中如何对Map List等对象序列化及反序列化

我们知道&#xff0c;在自定义类中&#xff0c;若想完成序列化必须要实现Serializable接口。 那么在实现后如何进行序列化呢&#xff1f; 一.普通对象 序列化&#xff1a; 1.首先我们要定义一个 序列化所需要的工具类 ObjectMapper //定义序列化所需要的工具类 转化机器…

笔试专题(十五)

文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的&#xff0c;所以i n-1时ret 3. 把水平的位置和上升部分&#xff0c;水平位置和下降部分分为一个排列子序列 代…

Amazon Bedrock Converse API:开启对话式AI新体验

Amazon Bedrock Converse API&#xff1a;开启对话式AI新体验 前言 在当今人工智能飞速发展的时代&#xff0c;对话式AI已成为众多应用的核心组成部分。从智能客服到智能助手&#xff0c;对话式AI为用户带来了便捷且高效的交互体验。而Amazon Bedrock Converse API的出现&…

【Springboot知识】Springboot计划任务Schedule详解

文章目录 Spring Boot 定时任务从原理到实现详解一、核心原理分析1. 架构分层2. 核心组件3. 线程模型 二、基础实现步骤1. 添加依赖2. 主类配置3. 定时任务类 三、高级配置技巧1. 自定义线程池2. 动态配置参数3. 分布式锁集成&#xff08;Redis示例&#xff09; 四、异常处理机…

MySQL:联合查询

目录 一、笛卡尔积 ​二、内连接 三、外连接 &#xff08;1&#xff09;左外连接 &#xff08;2&#xff09;右外连接 &#xff08;3&#xff09;全外连接 四、自连接 五、子查询 &#xff08;1&#xff09;单行子查询 &#xff08;2&#xff09;多行子查询 &…

深入理解 Cortex-M3 的内核寄存器组

每个 MCU 开发工程师一定都了解寄存器这个东西&#xff0c;以 STM32 为例&#xff0c;其拥有非常多的外设模块&#xff0c;如串口、SPI、IIC 等等&#xff0c;如果要使用这些外设&#xff0c;使其按照我们的要求工作&#xff0c;就需要配置这些外设的寄存器&#xff0c;往这些寄…

网络安全自动化:找准边界才能筑牢安全防线

数字时代&#xff0c;企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备&#xff0c;很多企业开始思考&#xff1a;哪些安全操作适合交给机器自动处理&#xff1f;哪些必须由人工把关&#xff1f;今天我们就用大白话聊聊这件事。 一、这些事…

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…

领略算法真谛: 多源bfs

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

雷电模拟器-超好用的Windows安卓模拟器

一、雷电模拟器介绍 雷电模拟器是一款功能强大的软件&#xff0c;它能够在电脑上模拟出安卓手机系统&#xff0c;让你可以在电脑上运行各类手机应用及游戏。其采用虚拟安卓手机操作界面&#xff0c;为玩家带来了独特的体验。 &#xff08;一&#xff09;强大的兼容性 雷电模拟…

文章三《机器学习基础概念与框架实践》

文章3:机器学习基础概念与框架实践 ——从理论到代码,用Scikit-learn构建你的第一个分类模型 一、机器学习基础理论:三大核心类型 机器学习是人工智能的核心,通过数据让计算机自动学习规律并做出预测或决策。根据学习方式,可分为三类: 1. 监督学习(Supervised Learni…

脑机接口技术:开启人类与机器的全新交互时代

在科技飞速发展的今天&#xff0c;人类与机器的交互方式正经历着前所未有的变革。从最初的键盘鼠标&#xff0c;到触摸屏&#xff0c;再到语音控制&#xff0c;每一次交互方式的升级都极大地提升了用户体验和效率。如今&#xff0c;脑机接口&#xff08;Brain-Computer Interfa…

8.2 GitHub企业级PDF报告生成实战:ReportLab高级技巧与性能优化全解析

GitHub企业级PDF报告生成实战:ReportLab高级技巧与性能优化全解析 GitHub Sentinel 高级功能实现:PDF 报告生成技术详解 关键词:PDF 报告生成, ReportLab 实战, 结构化数据转换, 容器化字体配置, 企业级报告模板 1. 需求分析与技术选型 PDF 报告生成需要满足以下技术要求…

架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案

文章目录 引言一、升级读服务架构&#xff0c;为什么需要自动化测试&#xff1f;二、自动化回归测试系统&#xff1a;整体架构概览三、日志收集1. 拦截方式2. 存储与优化策略3. 架构进化 四、数据回放技术实现关键能力 五、差异对比对比方式灵活配置 六、三种回放模式详解1. 离…

基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表

要实现基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表&#xff0c;首先需要对ShardingSphere进行一些基本配置。你提到的溯源码、批次号等数据需要考虑到跨年数据的存储&#xff0c;因此要设计一个能够动态扩展的分表策略 添加ShardingSphere依赖 在…