Bazel 是 Google 开源的一个编译工具,Bazel 使用分布式缓存和增量构建方法,使得编译更加快速。Bazel 原生支持 Java 和 C++ 语言,目前也开源了编译 Golang 项目的相关 rules。
下面介绍一下使用 Bazel 编译 Golang 项目的方法。
创建配置文件
首先,要在当前 project 的根目录下创建 WORKSPACE
和 BUILD.bazel
文件。其中 WORKSPACE
文件用于设置加载 Bazel 环境(包括rules)和相关依赖。
示例代码的 WORKSPACE
配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# download go bazel tools load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "io_bazel_rules_go", urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.17.0/rules_go-0.17.0.tar.gz"], sha256 = "492c3ac68ed9dcf527a07e6a1b2dcbf199c6bf8b35517951467ac32e421c06c1", ) # download the gazelle tool http_archive( name = "bazel_gazelle", urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.16.0/bazel-gazelle-0.16.0.tar.gz"], sha256 = "7949fc6cc17b5b191103e97481cf8889217263acf52e00b560683413af204fcb", ) # load go rules load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains") go_rules_dependencies() go_register_toolchains() # load gazelle load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") gazelle_dependencies() |
然后,配置 BUILD.bazel
文件:
1 2 3 4 5 6 |
load("@bazel_gazelle//:def.bzl", "gazelle") # you project name here! # gazelle:prefix bazeltest gazelle(name = "gazelle") |
注意:第二个注释里 prefix 后的字符串是有意义的,表示要编译的 project 的名称。
1 2 3 4 5 6 7 8 |
load("@bazel_gazelle//:def.bzl", "gazelle") # you project name here! gazelle( name = "gazelle", prefix = "bazeltest", ) |
然后使用下面的命令会生成 Bazel 编译项目所需的配置文件:
1 2 |
bazel run //:gazell |
生成的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") load("@bazel_gazelle//:def.bzl", "gazelle") # gazelle:prefix bazeltest gazelle(name = "gazelle") go_library( name = "go_default_library", srcs = ["hello.go"], importpath = "bazeltest", visibility = ["//visibility:private"], ) go_binary( name = "bazeltest", embed = [":go_default_library"], visibility = ["//visibility:public"], ) |
这里面,go_library
表示编译需要链接的源码和库文件的信息,go_binary
表示编译生成的二进制文件信息,里面的 name
就表示生成的二进制文件的名称。
编译
构建根目录下所有的 target:
1 2 |
bazel build //... |
注意 Bazel 使用 //
来表示当前 project 的根目录, ...
表示当前路径下所有的包,如果要编译特定路径下的包,使用:
1 2 |
bazel build //path_of_target:target_name |
运行程序:
编译后生成的二进制文件在 bazel-bin/darwin_amd64_stripped
路径下,运行:
1 2 |
bazel run //:target_name |
类似的,也可以使用 bazel test
运行测试程序。
本文作者:黄会栢