Bazel
Make, Maven, Gradleのようなビルドツール
Artifact-Based Build Systemというシステムを採用している
従来のTask-Based Build Systemでは、ビルドに必要なタスクを記述する
一方、Bazelでは成果物、依存関係などを記述する
Bazelの設定にはWORKSPACE, BUILDがある
最近ではWORKSPACEではなくMODULE.BAZELを使うようになっている模様
WORKSPACE
3rd party dependenciesなどをBazelプロジェクトで使うための設定を記述する
BUILD
Bazelがどのようにビルドするかの設定を記述する
WORKSPACE
リポジトリのトップにファイルを作成する
Goを使用している場合は以下を参照
code:bazel
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "io_bazel_rules_go",
integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=",
urls = [
],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
go_rules_dependencies()
go_register_toolchains(version = "1.22.4")
このファイルはBazelにrules_goとその依存を取得することを指示している
ちなみにインデントエラーとかもあるのでちょっと注意
BazelはGo toolchainをダウンロードして利用できるようにする
go buildでビルド可能な状態のプロジェクトであれば、Gazelleでビルドファイルを更新できるらしい
ここでいうビルドファイルって何osamtimizer.icon
Gazelleを使うには、これまたWORKSPACEに設定を追加する
code:bazel
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "io_bazel_rules_go",
integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=",
urls = [
],
)
// gazelleを追加している
http_archive(
name = "bazel_gazelle",
integrity = "sha256-12v3pg/YsFBEQJDfooN6Tq+YKeEWVhjuNdzspcvfWNU=",
urls = [
],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
go_rules_dependencies()
go_register_toolchains(version = "1.22.4")
gazelle_dependencies()
go_rules_dependencies()とかはrules_goリポジトリに記述されている
deps.bzlというファイルに関数が書かれている
code:deps.bzl
load(
"//go/private:nogo.bzl",
"go_register_nogo_wrapper",
)
load(
"//go/private:repositories.bzl",
_go_rules_dependencies = "go_rules_dependencies",
)
load(
"//go/private:sdk.bzl",
_go_download_sdk = "go_download_sdk",
_go_host_sdk = "go_host_sdk",
_go_local_sdk = "go_local_sdk",
_go_register_toolchains = "go_register_toolchains",
_go_wrap_sdk = "go_wrap_sdk",
)
go_rules_dependencies = _go_rules_dependencies
go_register_toolchains = _go_register_toolchains
go_download_sdk = _go_download_sdk
go_host_sdk = _go_host_sdk
go_local_sdk = _go_local_sdk
go_wrap_sdk = _go_wrap_sdk
go_register_nogo = go_register_nogo_wrapper
実際にはこんな感じで定義されてる
code:sdk.bzl
def go_host_sdk(name, register_toolchains = True, **kwargs):
go_host_sdk_rule(name = name, **kwargs)
_go_toolchains(
name = name + "_toolchains",
sdk_repo = name,
sdk_type = "host",
sdk_version = kwargs.get("version"),
goos = kwargs.get("goos"),
goarch = kwargs.get("goarch"),
)
if register_toolchains:
_register_toolchains(name)
独自の記法...!?
Pythonに似てるらしいけど、独自とのこと
Gazelleを走らせてみる
試しにGo example projectで
forkしたけど example ってすげー名前osamtimizer.icon
まずプロジェクトのトップにBUILD.bazelを手動で作成
code:BUILD.bazel
load("@bazel_gazelle//:def.bzl", "gazelle")
# gazelle:prefix github.com/example/project
gazelle(name = "gazelle")
code:bash
$ bazel run //:gazelle
INFO: Analyzed target //:gazelle (134 packages loaded, 11663 targets configured).
INFO: Found 1 target...
Target //:gazelle up-to-date:
bazel-bin/gazelle-runner.bash
bazel-bin/gazelle
INFO: Elapsed time: 48.914s, Critical Path: 28.01s
INFO: 65 processes: 18 internal, 47 darwin-sandbox.
INFO: Build completed successfully, 65 total actions
INFO: Running command line: bazel-bin/gazelle
すると以下のようなファイル群が生成される
code:bash
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
BUILD.bazel
MODULE.bazel
MODULE.bazel.lock
WORKSPACE
bazel-bin
bazel-hello
bazel-out
bazel-testlogs
hello
reverse/BUILD.bazel
ちょっと依存を追加してみる
code:bash
$ go get github.com/google/uuid
code:bash
$ bazel run //:gazelle -- update-repos -from_file=go.mod
code:diff
diff --git a/hello/WORKSPACE b/hello/WORKSPACE
index cf36b86..9853d64 100644
--- a/hello/WORKSPACE
+++ b/hello/WORKSPACE
@@ -18,8 +18,15 @@ http_archive(
],
)
+load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
-load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
+
+go_repository(
+ name = "com_github_google_uuid",
+ importpath = "github.com/google/uuid",
+ sum = "h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=",
+ version = "v1.6.0",
+)
go_rules_dependencies()
diff --git a/hello/go.mod b/hello/go.mod
index eb0dea6..17058b2 100644
--- a/hello/go.mod
+++ b/hello/go.mod
@@ -2,3 +2,4 @@ module golang.org/x/example/hello
go 1.19
+require github.com/google/uuid v1.6.0 // indirect
diff --git a/hello/hello.go b/hello/hello.go
index ce2a423..934c464 100644
--- a/hello/hello.go
+++ b/hello/hello.go
@@ -24,10 +24,9 @@ package main
import (
"flag"
"fmt"
+ "golang.org/x/example/hello/reverse"
"log"
"os"
-
- "golang.org/x/example/hello/reverse"
)
func usage() {
github.com/google/uuidの依存関係がWORKSPACEに追加される
go.modから依存関係を自動で検出してWORKSPACEに追記してくれるのがGazelle