🥬

Go with Bazel 入門 #1

2022/12/01に公開

なに?

Bazel Tutorial: Build a C++ Project を Go で置き換えてみます。

Stage 1: single target, single package

出来上がるもの

.
├── WORKSPACE
├── bazel-bin -> ...
├── bazel-out -> ...
├── bazel-stage1 -> ...
├── bazel-testlogs -> ...
├── cmd
│   ├── BUILD
│   └── main.go
└── go.mod
mkdir stage1
cd stage1

Go モジュールを初期化

go mod init github.com/kaito2/bazel-practice/stage1

cmd/main.go ファイルを作成

cmd/main.go
package main

import "fmt"

func main() {
	fmt.Println("Hello Bazel")
}

go コマンドで動くかを一応確認する。

$ go run cmd/main.go
Hello Bazel

ここから Bazel のセットアップ

WORKSPACE ファイル作成

WORKSPACE
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "io_bazel_rules_go",
    sha256 = "ae013bf35bd23234d1dea46b079f1e05ba74ac0321423830119d3e787ec73483",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.36.0/rules_go-v0.36.0.zip",
        "https://github.com/bazelbuild/rules_go/releases/download/v0.36.0/rules_go-v0.36.0.zip",
    ],
)

load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")

go_rules_dependencies()

go_register_toolchains(version = "1.19.3")

cmd/BUILD ファイルを作成

cmd/BUILD
load("@io_bazel_rules_go//go:def.bzl", "go_binary")

go_binary(
    name = "main",
    # コンパイル対象のファイルを指定
    srcs = ["main.go"],
)

Bazel を使って実行してみる。

$ bazel run //cmd:main
Starting local Bazel server and connecting to it...
INFO: Analyzed target //cmd:main (52 packages loaded, 9076 targets configured).
INFO: Found 1 target...
Target //cmd:main up-to-date:
  bazel-bin/cmd/main_/main
INFO: Elapsed time: 27.573s, Critical Path: 1.85s
INFO: 8 processes: 4 internal, 4 darwin-sandbox.
INFO: Build completed successfully, 8 total actions
INFO: Build completed successfully, 8 total actions
Hello Bazel

bazel run または bazel build でのターゲットの指定方法は以下の通り。

$ bazel run //[BUILDファイルのあるディレクトリへのパス]:[name]

今回は BUILD ファイルがディレクトリへのパス (正確には WORKSPACE ファイルが存在するディレクトリからの相対パス) は cmd で ターゲット名(name) が main なので以下のような実行方法だった。

$ bazel run //cmd:main

Discussion