Bazel项目目录结构

Bazel 是由 Google 开发的一款高效的构建和测试工具,广泛应用于大型项目中。Bazel 使用一套特定的文件结构和配置文件来描述项目的构建过程。以下是 Bazel 常见的文件结构及各个文件的详细作用介绍:

1. 项目根目录结构

一个典型的 Bazel 项目根目录结构可能如下所示:

my_project/
├── WORKSPACE
├── .bazelrc
├── BUILD
├── src/
│   ├── BUILD
│   ├── main/
│   │   ├── BUILD
│   │   ├── app/
│   │   │   ├── BUILD
│   │   │   └── ...
│   │   └── lib/
│   │       ├── BUILD
│   │       └── ...
│   └── test/
│       ├── BUILD
│       └── ...
├── third_party/
│   ├── BUILD
│   └── ...
└── README.md

1.1. 根目录文件

  • WORKSPACE

    • 作用:WORKSPACE 文件位于项目的根目录,用于定义项目的外部依赖和工作区信息。通过此文件,Bazel 知道如何获取和管理项目所依赖的第三方库、工具链等。

    • 内容示例

      workspace(name = "my_project")
      
      load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
      
      http_archive(
          name = "rules_python",
          url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.1.0.tar.gz",
          strip_prefix = "rules_python-0.1.0",
      )
      
      load("@rules_python//python:repositories.bzl", "py_repositories")
      
      py_repositories()
      
  • .bazelrc

    • 作用:.bazelrc 文件用于配置 Bazel 的构建选项和参数。通过此文件,用户可以为不同的构建命令(如 build、test 等)设置默认参数,简化命令行操作。

    • 内容示例

      common --copt=-O2
      build --jobs=4
      test --test_output=errors
      
  • BUILD

    • 作用:根目录下的 BUILD 文件用于定义项目的顶层构建规则。虽然通常在子目录中定义具体的 BUILD 文件,但根目录的 BUILD 文件适用于需要在整个项目级别管理的构建目标。

    • 内容示例

      load("//src/main:defs.bzl", "my_app")
      
      my_app(
          name = "my_app",
          srcs = glob(["src/main/app/**/*.java"]),
          deps = [
              "//src/main/lib:lib",
          ],
      )
      

1.2. 子目录文件

  • src/

    • 作用:存放源代码的目录。通常会按照功能模块或组件进一步划分子目录,如 main/test/
  • src/BUILD

    • 作用:定义 src 目录下的一些通用构建规则或聚合性规则,便于管理子模块的依赖关系。
  • src/main/BUILD

    • 作用:定义主应用程序的构建规则,包括应用程序的源代码、依赖库等。
  • src/main/app/

    • 作用:存放应用程序具体实现的目录。
  • src/main/app/BUILD

    • 作用:定义应用程序模块的具体构建规则,如编译 Java 文件、打包等。
  • src/main/lib/

    • 作用:存放库代码的目录,供应用程序或其他模块依赖。
  • src/main/lib/BUILD

    • 作用:定义库模块的构建规则,如编译库代码、生成库文件等。
  • src/test/

    • 作用:存放测试代码的目录。
  • src/test/BUILD

    • 作用:定义测试模块的构建规则,如编译测试代码、运行测试用例等。
  • third_party/

    • 作用:存放第三方依赖库的目录。这些依赖通常通过 WORKSPACE 文件中定义的规则进行管理,但部分手动添加的第三方库也会放在此目录。
  • third_party/BUILD

    • 作用:定义第三方库的构建规则,指定如何编译和链接这些外部库。

1.3. 其他文件

  • README.md

    • 作用:项目的说明文档,介绍项目的功能、使用方法、构建流程等信息。

2. 主要 Bazel 文件详细介绍

2.1. WORKSPACE 文件

WORKSPACE 文件是 Bazel 项目的入口文件,用于定义工作区的根,并管理外部依赖。它的主要职责包括:

  • 定义工作区名称:通过 workspace(name = "my_project") 指定工作区的名称。
  • 引入外部依赖:使用 http_archivegit_repository 等规则下载和管理第三方库。
  • 加载规则和工具链:通过 load 语句引入自定义规则或工具链配置。

常见用法示例

workspace(name = "my_project")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_go",
    urls = ["https://github.com/bazelbuild/rules_go/releases/download/v0.29.0/rules_go-v0.29.0.tar.gz"],
    strip_prefix = "rules_go-0.29.0",
)

load("@rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")

go_rules_dependencies()
go_register_toolchains()

2.2. BUILD 文件

BUILD 文件定义了项目中的构建目标和规则。每个 BUILD 文件对应一个目录,并描述该目录下的源代码如何被构建。

主要构建规则类型

  • cc_library / cc_binary:用于 C++ 库和可执行文件的构建。
  • java_library / java_binary:用于 Java 库和可执行文件的构建。
  • py_library / py_binary:用于 Python 库和可执行文件的构建。
  • go_library / go_binary:用于 Go 语言库和可执行文件的构建。
  • genrule:用于自定义生成命令的构建规则。

BUILD 文件示例

cc_library(
    name = "math_lib",
    srcs = ["math.cpp"],
    hdrs = ["math.h"],
    visibility = ["//visibility:public"],
)

cc_binary(
    name = "app",
    srcs = ["main.cpp"],
    deps = [":math_lib"],
)

BUILD 文件中的关键字段

  • name:目标名称。
  • srcs:源文件列表。
  • hdrs:头文件列表(主要适用于 C/C++ 项目)。
  • deps:依赖的其他构建目标。
  • visibility:定义目标的可见性范围。

2.3. .bazelrc 文件

.bazelrc 文件用于配置 Bazel 构建的默认参数和选项。可以定义不同的构建模式(如 debug、release)、优化选项、并行构建设置等。

常见配置示例

# 全局通用选项
build --copt=-O2
build --host_copt=-O2

# 调试模式
build:debug --compilation_mode=dbg
build:debug --strip=never

# 发布模式
build:release --compilation_mode=opt
build:release --strip=always

# 测试配置
test --test_output=errors
test --cache_test_results=no

# 并行构建
common --jobs=8

使用方法
可以通过命令行指定使用特定的配置,例如:

bazel build --config=release //src/main:app

2.4. WORKSPACE 之外的常见文件

  • .gitignore

    • 作用:列出应被 Git 忽略的文件和目录,通常包括 Bazel 的输出目录(如 bazel-bin/bazel-out/ 等)和临时文件。

    • 示例

      bazel-*
      *.launch
      *.log
      
  • BUILD.bazel

    • 作用:与 BUILD 文件功能类似,Bazel 也支持使用 BUILD.bazel 作为构建文件的名称,以避免与目录中的其他 BUILD 文件混淆。

3. Bazel 构建过程中的文件结构

在 Bazel 的构建过程中,Bazel 会维护一组中间文件和输出文件,这些文件主要存储在 Bazel 的输出目录(默认是 bazel-out/)中。以下是相关目录及其作用:

  • bazel-out/

    • 作用:存放 Bazel 构建过程中的所有中间文件和最终输出。例如,编译生成的二进制文件、生成的中间对象文件、缓存文件等。
  • bazel-bin/

    • 作用:存放最终可执行文件和库文件的符号链接,指向 bazel-out/ 中对应的实际文件。
  • bazel-genfiles/

    • 作用:存放通过生成规则(如 genruleproto_library 等)生成的文件。
  • bazel-testlogs/

    • 作用:存放测试运行的日志和报告文件。

这些目录通常会被自动管理,用户无需手动干预。

4. 示例项目说明

以下是一个简单的 Bazel 项目示例,帮助理解上述文件结构及其作用:

my_project/
├── WORKSPACE
├── .bazelrc
├── BUILD
├── src/
│   ├── BUILD
│   ├── main/
│   │   ├── BUILD
│   │   ├── app/
│   │   │   ├── BUILD
│   │   │   ├── main.cpp
│   │   │   └── ...
│   │   └── lib/
│   │       ├── BUILD
│   │       ├── math.cpp
│   │       └── math.h
│   └── test/
│       ├── BUILD
│       ├── test_main.cpp
│       └── ...
└── third_party/
    ├── BUILD
    └── external_lib/
        ├── lib.cpp
        └── lib.h

4.1. WORKSPACE 文件

workspace(name = "my_project")

# 引入第三方 C++ 库示例
http_archive(
    name = "external_lib",
    urls = ["https://example.com/external_lib.tar.gz"],
    strip_prefix = "external_lib-1.0.0",
)

load("@external_lib//:defs.bzl", "external_lib_rules")

external_lib_rules()

4.2. 根目录 BUILD 文件

# 定义顶层应用程序目标
cc_binary(
    name = "my_app",
    srcs = ["src/main/app/main.cpp"],
    deps = [
        "//src/main/lib:math_lib",
        "@external_lib//:external_lib",
    ],
)

4.3. src/main/lib/BUILD 文件

cc_library(
    name = "math_lib",
    srcs = ["math.cpp"],
    hdrs = ["math.h"],
    visibility = ["//visibility:public"],
)

4.4. src/test/BUILD 文件

cc_test(
    name = "math_test",
    srcs = ["test_main.cpp"],
    deps = [
        "//src/main/lib:math_lib",
        "@external_lib//:external_lib",
    ],
)

4.5. .bazelrc 文件

# 优化构建选项
build --copt=-O2
build --host_copt=-O2

# 并行构建设置
common --jobs=8

# 测试配置
test --test_output=errors

5. 自定义规则和扩展

Bazel 允许用户通过 Starlark(Bazel 的配置语言)自定义构建规则和扩展功能。这些自定义规则通常放在 defs.bzl 或类似的 .bzl 文件中,并在 BUILD 文件中加载和使用。

5.1. 自定义规则示例

defs.bzl 文件内容:

def my_app(name, srcs, deps=[]):
    cc_binary(
        name = name,
        srcs = srcs,
        deps = deps + ["//src/main/lib:math_lib"],
    )

BUILD 文件中的使用

load("//src/main:defs.bzl", "my_app")

my_app(
    name = "my_custom_app",
    srcs = ["app/custom_main.cpp"],
    deps = [
        "@external_lib//:external_lib",
    ],
)

通过自定义规则,可以简化构建过程,避免在多个 BUILD 文件中重复定义相似的构建逻辑。

6. 总结

Bazel 通过明确的文件结构和配置文件,实现了高效、可重复和可扩展的构建流程。

  • WORKSPACE:定义工作区和外部依赖。
  • BUILD(或 BUILD.bazel):定义构建目标和规则。
  • .bazelrc:配置构建选项和参数。
  • 源代码目录结构:根据项目需求组织源代码和模块。
  • 第三方依赖目录:管理外部库和工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高等数学学习笔记 ☞ 不定积分的积分方法

1. 第一换元积分法 1. 基础概念:形如的过程,称为第一换元积分法。 2. 核心思想:通过对被积函数的观察(把被积函数的形式与积分表的积分公式进行比较),把外部的部分项拿到的内部(求原函数), 然后进行拼凑,…

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框,增加子项,删除某项,取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置:Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考:使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面,生成了证书: 5.给浏览器安装Jmeter代理的证书…

红日-VulnStack靶场一

http://vulnstack.qiyuanxuetang.net/vuln/ 一、环境部署 win7(被攻击机/关火墙) web服务器 1张外网网卡(桥接192.168.1.105),一张内网网卡192.168.52.143/255.255.255.0/192.168.52.2 DNS 192.168.52.138 winser2008 域控服务器 1张…

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯,如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本,但是有种种的不适应,如何能恢复到之前的旧版本呢?我们来看看操作步骤,而且无需卸载重装。 怎么恢复Chrome 之前版本&a…

云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破

在信息技术应用创新的浪潮中,仓颉社区吸引了众多企业和开发者的积极参与,已有多个应用成功落地,展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用,并颁发…

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…

Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数

目录 模版 先序遍历 中序遍历 后序遍历 力扣原题 相同的二叉树 力扣原题 翻转二叉树 遍历树的层数 题目 静态变量 核心逻辑 模版 // 二叉树public static class Node{public int value;public Node left;public Node right;public Node(int v) {valuev;}} 先序遍历 …

P6周:VGG-16算法-Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 我的环境 语言环境:Python 3.8.12 编译器:jupyter notebook 深度学习环境:torch 1.12.0cu113 一、前期准备 1.设置GPU im…

Ubuntu、Windows系统网络设置(ping通内外网)

一、 虚拟机VMware和Ubuntu系统的网络配置说明 1、虚拟机的网络适配器的模式有三种: 桥接模式NAT模式主机模式 2、虚拟机VMware的网卡配置(如何进行配置界面(虚拟机->设置)) 注意: 1、以上桥接模式(ubuntu有独立IP)、NAT模式(没有独立IP)都可以联…

Web端实时播放RTSP视频流(监控)

一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <

Mongodb相关内容

Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载&#xff1a;https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一&#xff1a; 方式2&#xff1a; 方式3&#…

SQL2000在win10上安装的方法

安装前最好先关闭防火墙和一些杀毒软件&#xff0c;因为这些软件在安装过程中可能会碰到注册表等一下杀毒软件比较敏感的地带&#xff0c;如果违反杀毒软件的规则会被当做病毒强行终止删除 首相找到C盘下window文件中的sysWOW64文件 鼠标右键&#xff0c;点击属性、安全、高级 …

EAMM: 通过基于音频的情感感知运动模型实现的一次性情感对话人脸合成

EAMM: 通过基于音频的情感感知运动模型实现的一次性情感对话人脸合成 1所有的材料都可以在EAMM: One-Shot Emotional Talking Face via Audio-Based Emotion-Aware Motion Model网站上找到。 摘要 尽管音频驱动的对话人脸生成技术已取得显著进展&#xff0c;但现有方法要么忽…

【华为路由/交换机的ftp文件操作】

华为路由/交换机的ftp文件操作 PC&#xff1a;10.0.1.1 R1&#xff1a;10.0.1.254 / 10.0.2.254 FTP&#xff1a;10.0.2.1 S1&#xff1a;无配置 在桌面创建FTP-Huawei文件夹&#xff0c;里面创建config/test.txt。 点击上图中的“启动”按钮。 然后ftp到server&#xff0c;…

Web前端开发技术之HTMLCSS知识点总结

学习路线 一、新闻网界面1. 代码示例2. 效果展示3. 知识点总结3.1 HTML标签和字符实体3.2 超链接、颜色描述与标题元素3.3 关于图片和视频标签&#xff1a;3.4 CSS引入方式3.5 CSS选择器优先级 二、flex布局1. 代码示例2. 效果展示3. 知识点总结3.1 span标签和flex容器的区别3.…

基于SSM汽车美容管家【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

idea gradle compiler error: package xxx does not exist

idea 编译运行task时报项目内的包不存在&#xff0c;如果你试了网上的其它方法还不能解决&#xff0c;应该是你更新了新版idea&#xff0c;项目用的是旧版jdk&#xff0c;请在以下编译器设置中把项目JDK字节码版本设为8&#xff08;jdk1.8&#xff0c;我这里是17请自行选择&…

1.17学习

crypto nssctf-[SWPUCTF 2021 新生赛]crypto8 不太认识这是什么编码&#xff0c;搜索一下发现是一个UUENCODE编码&#xff0c;用在线工具UUENCODE解码计算器—LZL在线工具解码就好 misc buuctf-文件中的秘密 下载附件打开后发现是一个图片&#xff0c;应该是一个图片隐写&…

Formality:参考设计/实现设计以及顶层设计

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482​​​ Formality存在两个重要的概念&#xff1a;参考设计/实现设计和顶层设计&#xff0c;本文就将对此进行详细阐述。参考设计/实现设计是中两个重要的全局概念&am…