【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.pswp.cn/news/904239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904239.shtml
英文地址,請注明出處:http://en.pswp.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依賴 在…