文章目錄
Bazel
什麼是bazel
官方給出的介紹是
Build and test software of any size, quickly and reliably
一個快速可靠地構建和測試各種規模的軟件.
bazel四個特點:
- Speed up your builds and tests
- one tool,multiple languages
- scalaable
- extensible to your needs
如何安裝bazel
bazel的安裝教程可以參考鏈接:https://docs.bazel.build/versions/master/install-os-x.html
install Xcode command line tools
sudo xcodebuild -license accept
download the bazel installer
這裏我使用的版本是2.0.0
wget https://github.com/bazelbuild/bazel/releases/download/2.0.0/bazel-2.0.0-installer-darwin-x86_64.sh
run the installer
chmod +x bazel-2.0.0-installer-darwin-x86_64.sh
./bazel-2.0.0-installer-darwin-x86_64.sh --user
setup environment
export PATH="$PATH:$HOME/bin"
按上述步驟安裝後可以看到bazel的版本
$ bazel version
Build label: 2.0.0
Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Thu Dec 19 12:33:30 2019 (1576758810)
Build timestamp: 1576758810
Build timestamp as int: 1576758810
搭建項目
整體結構
倉庫鏈接爲:https://github.com/dlutzhangyi/codebuild
實例項目簡單的使用gin來啓動一個http服務,代碼結構如下所示。
- build.sh爲項目的構建腳本
- cmd/master/main.go是項目主入口
$ tree .
.
├── README.md
├── build.sh
├── cmd
│ └── master
│ └── main.go
├── go.mod
├── go.sum
2 directories, 9 files
main函數的內容爲gin給出的一個官方例子。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
使用bazel構建項目
WORKSPACE和BUILD.bazel
參考鏈接
rules_go
WORKSPACE
首先在項目的根目錄下創建WORKSPACE文件,並使用gazelle生成和更新項目中的build文件。
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/v0.20.3/rules_go-v0.20.3.tar.gz",
"https://github.com/bazelbuild/rules_go/releases/download/v0.20.3/rules_go-v0.20.3.tar.gz",
],
sha256 = "e88471aea3a3a4f19ec1310a55ba94772d087e9ce46e41ae38ecebe17935de7b",
)
load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
go_rules_dependencies()
go_register_toolchains()
http_archive(
name = "bazel_gazelle",
urls = [
"https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/bazel-gazelle/releases/download/v0.19.1/bazel-gazelle-v0.19.1.tar.gz",
"https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.19.1/bazel-gazelle-v0.19.1.tar.gz",
],
sha256 = "86c6d481b3f7aedc1d60c1c211c6f76da282ae197c3b3160f54bd3a8f847896f",
)
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
gazelle_dependencies()
BUILD.bazel
在項目的根目錄下寫入BUILD.bazel文件
load("@bazel_gazelle//:def.bzl", "gazelle")
# gazelle:prefix github.com/codebuild
gazelle(name = "gazelle")
使用bazel運行
更新倉庫
$ bazel run //:gazelle -- update-repos -from_file=go.mod
生成並更新各目錄下的BUILD.bazel文件
bazel run //:gazelle
運行項目,執行命令bazel run //cmd/master:master
$ bazel run //cmd/master:master
INFO: Analyzed target //cmd/master:master (15 packages loaded, 157 targets configured).
INFO: Found 1 target...
Target //cmd/master:master up-to-date:
bazel-bin/cmd/master/darwin_amd64_stripped/master
INFO: Elapsed time: 5.178s, Critical Path: 4.26s
INFO: 16 processes: 16 darwin-sandbox.
INFO: Build completed successfully, 19 total actions
INFO: Build completed successfully, 19 total actions
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /ping --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
參考鏈接
https://github.com/bazelbuild/rules_go/issues/2262
https://juejin.im/post/5c8e503a6fb9a070d878184a
https://github.com/bazelbuild/rules_go
https://bazel.build/
https://zhuanlan.zhihu.com/p/95998597?utm_source=wechat_session&utm_medium=social&utm_oi=610540003281997824