Bazel

article/2025/9/13 11:07:54

bazel:是一个可以快速构建和测试任意规模软件的编译工具,能够用来编译大部分语言。Bazel使用分布式缓存和增量构建方法,使得编译更加快速。

Bazel 主要文件
使用 Bazel 管理的项目一般包含以下几种 Bazel 相关的文件:WORKSPACE,BUILD(.bazel),.bzl 和 .bazelrc 等。其中 WORKSPACE 和 .bazelrc 放置于项目的根目录下,BUILD.bazel 放项目中的每个文件夹中(包括根目录), .bzl 文件可以根据用户喜好自由放置,一般可放在项目根目录下的某个专用文件夹(比如 build)中。

WORKSPACE

1.定义项目根目录和项目名。
2.加载 Bazel 工具和 rules 集。
3.管理项目外部依赖库。
# 加载bazel标准库中的函数http_archive
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")# 调用http_archive下载rules_go
http_archive(name = "io_bazel_rules_go",# 下面两项需要根据官方的最近版本来修改urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.16.1/rules_go-0.16.1.tar.gz"],sha256 = "f87fa87475ea107b3c69196f39c82b7bbf58fe27c62a338684c20ca17d1d8613",
)# 获取gazelle
http_archive(name = "bazel_gazelle",# 同样需要根据官方最新版本修改urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.15.0/bazel-gazelle-0.15.0.tar.gz"],sha256 = "6e875ab4b6bf64a38c352887760f21203ab054676d9c1b274963907e0768740d",
)# 从rules_go中加载go_rules_dependencies,go_register_toolchains
load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains")# 加载rules_go依赖
go_rules_dependencies()# 加载rules_go工具
go_register_toolchains()# 从gazelle中加载gazelle_dependencies
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")# 加载gazelle依赖
gazelle_dependencies()

BUILD.(bazel)
该文件主要针对其所在文件夹进行依赖解析(label)和目标定义(bazel target)。拿 go 来说,构建目标可以是 go_binary、go_test、go_library 等。

Bazel 的之前版本用的文件名是 BUILD ,但是在一些大小写不区分的系统上,它很容易跟 build 文件混淆,因此后来改为了显式的 BUILD.bazel 。如果项目中同时存在两者,Bazel 更倾向于使用后者。对于所有的新项目,都推荐使用显式的 BUILD.bazel。

为了引用一个依赖,Bazel 使用 label 语法对所有的包进行唯一标识,其格式如下:

@workerspace_name//path/of/package:target

比如,go 中常用的一个日志库 logrus 的 label 为:

@com_github_sirupsen_logrus//:go_default_library

如果是本项目中的包路径,可以将 // 之前的 workspace 名字省去。

自定义 rule (*.bzl)
如果你的项目有一些复杂构造逻辑、或者一些需要复用的构造逻辑,那么可以将这些逻辑以函数形式保存在 .bzl 文件,供 WORKSPACE 或者 BUILD 文件调用。其语法跟 Python 类似:

def third_party_http_deps():http_archive(name = "xxxx",...)http_archive(name = "yyyy",...)

配置项 .bazelrc
其中 rc 后缀的命名方式是个计算机中经典的小习俗,感兴趣可以看看 StackOverflow 这个回答。简单的说,该文件用来配置对应的命令运行时的一些参数。常见的如 .vimrc,.bashrc 等。

对于 Bazel 来说,如果某些构建动作都需要某个参数,就可以将其写在此配置中,从而省去每次敲命令都重复输入该参数。举个 Go 的例子:由于国情在此,构建、测试和运行时可能都需要 GOPROXY,则可以配置如下:

# set GOPROXY
test --action_env=GOPROXY=https://goproxy.io
build --action_env=GOPROXY=https://goproxy.io
run --action_env=GOPROXY=https://goproxy.io

Bazel 构建 golang 项目

在有了上面 Bazel 的基础知识后,构建 golang 项目还需要了解两个概念:rules_go 和 bazel gazelle。
rules_go
rules_go 是一个 Bazel 的扩展包,Bazel 可以编译 Go。它由一系列的 rule 构成,包括 go_libray\go_binary\go_test,支持 vendor、交叉编译;可以方便集成 protobuf 、cgo 、gogo、nogo等工具。

它会在 Bazel 的沙箱中进行编译,不依赖本地 GOROOT/GOPATH,而是自动下载对应 Go 版本,从而可以在不同平台上进行一致性的编译。

bazel gazelle
Gazelle 是一个自动生成 Bazel 编译文件工具,包括给 WORKSPACE 添加外部依赖、扫描源文件依赖自动生成 BUILD.bazel 文件等。Gazelle 原生支持 Go 和 protobuf,当然可以通过扩展来支持其他语言和规则。Gazelle 可以使用 bazel 命令结合 gazelle rule 运行,也可以下载使用单独的 Gazelle 的命令行工具。

  1. 自动添加外部依赖
    bazel run //:gazelle update-repos repo-uri 可以从 go.mod 导入对应依赖包。
    比如想要往项目中增加 Kafka 的 segmentio 的 go client 包,只需要在项目根目录下执行命令: bazel run //:gazelle update-repos github.com/segmentio/kafka-g
    Gazelle 便会自动增加一条依赖到 WORKSPACE 文件:
go_repository(name = "com_github_segmentio_kafka_go",importpath = "github.com/segmentio/kafka-go",sum = "h1:Mv9AcnCgU14/cU6Vd0wuRdG1FBO0HzXQLnjBduDLy70=",version = "v0.3.4",
)
  1. 自动生成构建文件
    Gazelle 能够自动生成每个目录下的 BUILD.bazel 文件,只需要简单的两步:
    (1)在项目根目录的 BUILD.bazel 中配置加载并配置 Gazelle:
    load("@bazel_gazelle//:def.bzl", "gazelle")# gazelle:prefix your/project/url    gazelle(name = "gazelle") 

需要注意的是 # 后面的内容对于 Bazel 而言是注释,对于 Gazelle 来说却是一种语法,会被 Gazelle 运行时所使用。当然 Gazelle 除了可以通过 bazel rule 运行,也可以单独在命令行中执行。

(2)在根目录下执行 bazel run //:gazelle

一些实践
Bazel 有一些比较实用的实践,比如使用 http_archive 下载确定版本的外部依赖包、使用 stamp 变量注入、打包和发布等等。可以多去一些有很好的 Bazel 构建项目实践的开源项目中去看看:

github.com/kubernetes/test-infra(go 语言项目最佳实践,比较全面的 bazel 深度使用)
github.com/kubernetes/repo-infra(go 语言项目最佳实践,配置和脚本非常精妙)

1. 创建工作空间WORKSPACE和BUILD.bazel:
在使用bazel的时候,需要先创建一个WORKSPACE文件在你的项目根目录,表示这是bazel的工作空间,后续所有的配置都是基于这个目录来的。
要在当前 project 的根目录下创建 WORKSPACE 和 BUILD.bazel 文件。其中 WORKSPACE 文件用于设置加载 Bazel 环境(包括rules)和相关依赖。
创建一个WORKSPACE文件 添加以下内容:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")http_archive(name = "io_bazel_rules_go",urls = ["https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.19.0/rules_go-0.19.0.tar.gz","https://github.com/bazelbuild/rules_go/releases/download/0.19.0/rules_go-0.19.0.tar.gz",],sha256 = "9fb16af4d4836c8222142e54c9efa0bb5fc562ffc893ce2abeac3e25daead144",
)load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")go_rules_dependencies()
go_register_toolchains()

这里面的内容不需要手写啊,你去https://github.com/bazelbuild/rules_go/releases 复制过来就好了。

然后创建一个BUILD.bazel文件,添加一下内容:

load("@io_bazel_rules_go//go:def.bzl", "go_binary")go_binary(name = "go_default_library",srcs = ["main.go"],importpath = "test",visibility = ["//visibility:private"],
)

2. 编写main.go
配置了上面的东西之后,我们在项目目录下创建一个main.go的文件,内容如下:

package mainimport "fmt"func main() {fmt.Println("hello go!!!!")
}

当前的目录结构:
在这里插入图片描述
非常简单,只有3个文件,然后我们看下怎么用bazel来运行这个go程序。

在项目的根目录下执行一下命令:

bazel run //:go_default_library

如果你是第一次跑的话可能会需要一点时间:
在这里插入图片描述

3. 使用gazelle自动生成BUILD.bazel文件
上面看到了,我们需要手写BUILD.bazel?那如果大项目包很多的话,不是要写到吐血?下面就来说下,怎么用gazelle这个工具来自动给每个包生成一个BUILD.bazel的文件。

需要添加gazelle这个工具到我们的WORKSPACE文件中。

# 加载bazel标准库中的函数 http_archive
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
# 调用http_archive下载rules_go
http_archive(name = "io_bazel_rules_go",# 下面两项需要根据官方的最近版本来修改urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.16.1/rules_go-0.16.1.tar.gz"],sha256 = "f87fa87475ea107b3c69196f39c82b7bbf58fe27c62a338684c20ca17d1d8613",
)
# 获取gazelle
http_archive(name = "bazel_gazelle",# 同样需要根据官方最新版本修改urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.15.0/bazel-gazelle-0.15.0.tar.gz"],sha256 = "6e875ab4b6bf64a38c352887760f21203ab054676d9c1b274963907e0768740d",
)
# 从rules_go中加载go_rules_dependencies,go_register_toolchains
load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains")
# 加载rules_go依赖
go_rules_dependencies()
# 加载rules_go工具
go_register_toolchains()
# 从gazelle中加载gazelle_dependencies
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
# 加载gazelle依赖
gazelle_dependencies()

然后修改跟目录下的BUILD.bazel文件内容如下:

load("@bazel_gazelle//:def.bzl", "gazelle")# gazelle:prefix your_project_name
gazelle(name = "gazelle")

然后运行以下命令:

bazel run //:gazelle

构建
1.使用gazelle生成build文件
2.使用生成的build文件构建项目代码

使用gazelle自动生成build文件
bazel run //:gazelle#使用生成的build文件构建
#构建根目录下所有target
bazel build //...
#构建特定taget
bazel build //path/of/target:target_name

Golang项目bazel指北:
https://zhuanlan.zhihu.com/p/52155083
使用bazel编译go项目
https://juejin.im/post/6844903892757528590
使用 Bazel 构建 Golang 项目
https://blog.didiyun.com/index.php/2019/03/27/bazel-golang/
Bazel 构建 golang 项目
https://zhuanlan.zhihu.com/p/95998597


http://chatgpt.dhexx.cn/article/nY9gJ0gx.shtml

相关文章

BlazeDS

BlazeDS 为使用Flex 或者AIR 的客户端程序提供了高度可扩展的远程访问和消息服务。 blazeds :是一门技术,是一门面向AS的前后台通讯框架 在服务器端:提供3种服务,远程调用(remoting-config.xml中配置),访问…

Blazeds(一)

Blazeds体系结构 一个Blazeds应用包含了一个运行在浏览器或者Adobe AIR的客户端应用并且和J2EE应用服务端通信。客户端可以是Flex也可以是结合Flex、HTML/JavaScript的应用程序。 整个体系主要包括通道、端点、消息、服务、目的地、适配器等,把这些搞懂也就…

Blazor 简介

Blazor 是一个用于使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建丰富的交互式 UI。共享使用 .NET 编写的服务器端和客户端应用逻辑。将 UI 呈现为 HTML 和 CSS,以支持众多浏览器,其中包括移动浏览器。 使用 .…

blaze介绍

sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 项目联系 QQ:231469242 FICO FICO(NYSE: FICO)是全…

BlazePose

摘要 我们提出了BlazePose,一种轻量级卷积神经网络架构,用于人体姿态估计,可用于移动设备上的实时推断。在推理过程中,网络为一个人产生33个身体关键点,在Pixel 2手机上以每秒30帧以上的速度运行。这使得它特别适合姿态…

BlazeDS介绍

概况 BlazeDS是用来处理J2EE服务器与远程客户端之间远程通信的组件,它以Servlet的形式部署在J2EE容器里,专门负责处理通信。一般而言,远程客户端采用Flex编写,因为Flex组件中对通信细节进行了良好的封装,使得Flex程序员不必关心通信细节。 图1 BlazeDS概况 BlazeDS应用程…

初探blazeDS

blazeDS是一套面向actionscript的前后台通信框架。 在服务器端,blazeDS以servlet的方式存在于java应用服务器上。它默认提供3中服务,远程调用(在remoting-config.xml中配置)、访问代理(proxy-config.xml)、…

BlazeDS详解

一、Blazeds初步 客户端应用 Blazeds包括客户端和服务端应用。客户端应用是典型的Adobe flex或者AIR应用。Flex和AIR应用使用flex组件和blazeds服务通信,包括Remote Object、HTTPService、WebService、Produce和Consumer。其中的HTTPService、WebService、Produce和…

MySQL配置Amoeba中间件

MySQL配置Amoeba中间件 Amoeba介绍环境配置安装Amoeba配置Amoeba配置文件配置dbServers.xml,设置数据库,登录MySQL的账号和密码 启动Amoeba注意事项 Amoeba介绍 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中…

MySQL主从复制和基于Amoeba的读写分离部署

文章目录 MySQL主从复制和基于Amoeba读写分离什么是主从复制?为什么要有MySQL主从复制?什么是读写分离?一、MySQL主从复制原理二、主从复制的工作过程三、主从复制方式1、异步复制方式2、半同步复制/增强半同步复制3、全同步复制4、多线程复制…

amoeba mysql下载_amoeba数据库中间件透明实现MYSQL读写分离

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(…

mysql amoeba_MySQL基于Amoeba实现读写分离

读写分离应用分析: 在企业用户中,在大量的数据请求下,单台数据库将无法承担所有读写操作。解决方法: 配置多台数据库服务器以实现主从复制读写分离。 1、基于程序代码内部实现 在代码中根据select、 insert 进行路由分类,这种方法…

mysql amoeba 配置_Amoeba新版本MYSQL读写分离配置

官方简介 Amoeba的中文意思是变型虫 主要解决: • 降低 数据切分带来的复杂多数据库结构 • 提供切分规则并降低 数据切分规则 给应用带来的影响 • 降低db 与客户端的连接数 • 读写分离 个人简单描述 可能你还没明白Amoebla这鬼东西主要干麻的呢!比方说…

amoeba mysql_Mysql 基于 Amoeba 的 读写分离

首先说明一下amoeba 跟 MySQL proxy在读写分离的使用上面的区别: 在MySQL proxy 6.0版本 上面如果想要读写分离并且 读集群、写集群 机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本…

amoeba mysql binary_amoeba安装与实现amoeba for mysql读写分离

运行环境 l CentOS6.3 l Jdk1.6.0_30 l amoeba-mysql-binary-2.2.0 l amoeba:192.168.88.17 l master1:192.168.88.10 l slave1:192.168.88.11 一: 安装jdk1.5以上版本 1.1 卸载centos服务器自带版本jdk 1.1.1 …

amoeba-mysql主从复制配置

amoeba-mysql主从复制配置 主mysql192.168.8.186 1. 同步时间ntpdate ntp.org.cn 2. 打开mysql配置文件/etc/my.cnf,在mysqld下添加 a) log-binmaster-bin ---------启动二进制日志系统 b) server-id1 ---------服务id,主服务器server-id比从服务器serv…

mysql amoeba 事务_MySQL-Amoeba

Amoeba 变形虫 Amoeba 变形虫服务默认端口号8066 该软件能识别读写请求,把读写请求分配到不同的后端MySQL服务器 不用像MySQL-router用端口进行区分读写。 实验: 为了查看读写分离效果 本实验就不配置主从复制 1、 首先IP规划 amoeba:192.168.1.76 master:192.168.1…

amoeba mysql proxy_mysql-proxy和amoeba 分别实现Mariadb读写分离

内容概览: 1、mysql-proxy实现Mariadb读写分离 1、1 拓扑图和环境介绍 1、2 mysql-proxy安装 1、3 设置mysql-proxy 1、4 主节点添加mysql-proxy可访问用户 1、5 读写分离验证 2、amoeba 2、1 amoeba工作原理图 2、2 环境拓扑 2、3 配置JAVA环境 2、4 安装配置amoeb…

amoeba mysql_使用Amoeba 实现MySQL DB 读写分离

Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for MySQL软件; 这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发&am…

amoeba mysql_mysql中间件-amoeba

中间件:一种提供在不同技术、不同的软件之间共享资源的程序,更大化了利用了数据库的性能,可以无限扩展(注:真实环境中并非如此) 数据库的中间件: mysql proxy (官方版本)性能低,需要lua 脚本 atlas 性能低&…