使用bazel構建golang的項目

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

發佈了51 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章