讲师中心 微信公众号
AI工具推荐 视频效率加速

使用 Bazel 和 Go lang 的简单 hello world 程序

酷墨大大_3846

酷墨大大_3846

发布时间:2024-10-25 15:51:36

|

1307人浏览过

|

来源于dev.to

转载

使用 bazel 和 go lang 的简单 hello world 程序

在写了“使用 bazel、gazelle 和 bzlmod 在 monorepo 中使用 go 进行构建”的文章并与一些同事分享后,我发现人们对 monorepo 开发越来越感兴趣。我了解到,没有多少人仍然有足够的经验来了解它可以带来的好处。所以我决定将其转换为一个系列,从这篇关于使用 bazel 和 go lang 的简单 hello world 程序的文章开始

在这篇文章中,我将尝试介绍 bazel 的一些极其基本的概念以及代码片段,以便让人们立即上手。

巴泽尔是什么?

根据官方文档

bazel 是一个类似于 make、maven 和 gradle 的开源构建和测试工具。它使用人类可读的高级构建语言。 bazel 支持多种语言的项目并为多个平台构建输出。 bazel 支持跨多个存储库的大型代码库和大量用户。

它已经在 google 使用了数十年,并且经过了彻底的实战测试。您可以在上面链接的帖子中详细了解我如何意识到这一点。


第 1 步:设置存储库

出于本系列的目的,我在 github.com/nixclix/basil 创建了一个存储库,该存储库将随着时间的推移而不断发展。在撰写本文时,最新提交为 https://github.com/nixclix/basil/tree/d8af2aea6fb8b692f735f9959429df9fcd28422b

所以,继续在您想要选择的任何提供商上创建一个新的 git 存储库

对于 .gitignore,我强烈建议添加以下内容,以免在提交中包含不必要的文件

# if you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/golang/go.allowlist.gitignore
#
bazel-*
/.ijwb
/.clwb
/.idea
/.project
*.swp
/.bazelrc.user

# macos-specific excludes
.ds_store

# binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# test binary, built with `go test -c`
*.test

# output of the go coverage tool, specifically when used with liteide
*.out

# dependency directories (remove the comment below to include it)
# vendor/

# go workspace file
go.work
go.work.sum

# env file
.env

第 2 步:添加一些 bazel 样板

从 bazel 6.3 开始,您不再需要 workspace 文件。因此,我们将从在存储库的根目录创建以下内容开始

模块.bazel

"""building go applications in a monorepo environment"""

module(name = "basil", version = "0.0.0")
http_file = use_repo_rule(
    "@bazel_tools//tools/build_defs/repo:http.bzl", "http_file"
)
http_archive = use_repo_rule(
    "@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive"
)

# https://github.com/bazelbuild/rules_go/blob/master/docs/go/core/bzlmod.md
bazel_dep(name = "rules_go", version = "0.50.1")
bazel_dep(name = "gazelle", version = "0.39.1")

go_version = "1.23.2"

go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk")
go_sdk.download(version = go_version)

go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")

这里是我们设置要使用的 go 版本以及瞪羚和rules_go 版本的地方。

我们将使用 gazelle 进行 build 文件管理。 gazelle 使得生成构建文件变得非常方便。您可以在这里阅读更多相关信息

build.bazel

load("@gazelle//:def.bzl", "gazelle")

gazelle(name = "gazelle")

gazelle(
    name = "gazelle-update-repos",
    args = [
        "-from_file=go.mod",
        "-to_macro=deps.bzl%go_dependencies",
        "-prune",
    ],
    command = "update-repos",
)

这应该位于存储库的根目录。这会指示瞪羚了解 go mod 文件的来源以及其他要运行的进程

接下来我们再创建 3 个包含各自内容的文件。现在不用担心这些的作用。

.bazelignore

git摸鱼周报自动化
git摸鱼周报自动化

生成周报:读取本机 Git 仓库最近一周的提交记录,按项目分类提炼总结,生成标准周报格式,通过微信推送并返回给用户。触发词:周报、weekly report、git总结、提交记录总结、工作周报。

下载
runfiles/
bzlmod/

.bazelrc

# enable bzlmod for every bazel command
common --enable_bzlmod

.bazel版本

7.3.1

好吧,至此您应该具备了进行一些基础工作所需的一切。现在,如果您在根目录运行 bazel build //... ,bazel 应该能够遍历存储库并构建它发现的任何包。 bazel 缓存早期构建的包输出,因此从这里开始的任何后续构建都应该非常快。

接下来,让我们开始破解实际的 hello world 程序。

第三步:编写helloworld包

对于代码的基本组织,我们将在名为 /packages 的目录中编写所有 go 代码。这样,代码其他部分中的任何引用都可以将其引用为 //packages/...

让我们在packages目录中创建一个名为helloworld的目录并添加以下内容

helloworld.go

package main

import (
    "fmt"
)

func main() {
    fmt.println("hello world!")
}

build.bazel

load("@rules_go//go:def.bzl", "go_binary", "go_library")

go_binary(
    name = "helloworld",
    embed = [":helloworld_lib"],
    importpath = "basil/packages/helloworld",
    visibility = ["//visibility:private"],
)

go_library(
    name = "helloworld_lib",
    srcs = ["helloworld.go"],
    importpath = "basil/packages/helloworld_lib",
    visibility = ["//visibility:private"],
)

go 程序相当简单。我们有一个简单的 main 函数,可以简单地打印一条 hello world 消息。

我们感兴趣的是 build.bazel 文件。让我们逐块地看一下这个并尝试理解它的含义。

第一行从rules_go加载go_binary和go_library宏。您会发现这些在稍后的代码中被使用。

在第 10 行中,我们定义了一个名为 helloworld_lib 的库,并将该库的源指定为 helloworld.go。如果这个包需要我导入,那么您还可以指定它的可用路径,即 basil/packages/helloworld_lib。然后是可见性,在这里我们指定该库是私有的,仅在此包中可见。在以后的文章中,我们可能会研究如何更改这些参数以使用其他包的依赖项。

在第 3 行中,我们使用 rules_go 中的 go_binary 宏为我们的程序生成二进制文件。这里我们指定之前在 embed 参数中定义的库。包可见性也适用于二进制文件。


第 4 步:构建并运行

就是这样。瞧!您可以通过首先使用 bazel build //packages/helloworld 构建它,然后使用 bazel run //packages/helloworld

来运行二进制文件

如果您喜欢这篇文章,并且希望获得以此为基础的未来帖子作为该系列的一部分,请订阅并分享这篇文章。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

4100

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

389

2026.05.09

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

8625

2026.01.21

GitHub官网入口版本汇总
GitHub官网入口版本汇总

本专题整合了GitHub入口版本地址汇总,阅读专题下面的文章了解更多详细内容。

918

2026.04.02

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

6759

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

1920

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

1134

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4397

2024.04.09

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 8.1万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn