バージョン注入を持つGoプロジェクトのMakefile
ビルド、テスト、lint、ldflagsによるバージョン注入、クロスコンパイル、Docker統合ターゲットを持つGoプロジェクト用Makefileを構築します。
Language-Specific
詳細な説明
Goプロジェクトのビルド自動化
Goには組み込みのビルドツールがありますが、Makefileは一般的な操作の標準化、ビルド時のバージョン情報注入、クロスコンパイルターゲットの提供に価値を加えます。
ldflagsによるバージョン注入
VERSION := $(shell git describe --tags --always --dirty)
BUILD_TIME := $(shell date -u '+%Y-%m-%d_%H:%M:%S')
LDFLAGS := -ldflags "-X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME)"
:=演算子はパース時にシェルコマンドを即座に評価します。-ldflags -Xフラグはリンク時にGo変数に文字列値を注入し、ソースコードを変更せずにバージョンとビルド情報を埋め込みます。
ビルドとテストターゲット
.PHONY: build test lint vet
build:
go build $(LDFLAGS) -o bin/$(BINARY_NAME) ./cmd/...
test:
go test -v -race -coverprofile=coverage.out ./...
lint:
golangci-lint run ./...
vet:
go vet ./...
-raceフラグはテスト中にレースディテクタを有効にします。./...パターンはGoにすべてのパッケージを再帰的に処理するよう指示します。
クロスコンパイル
build-linux:
GOOS=linux GOARCH=amd64 go build $(LDFLAGS) -o bin/$(BINARY_NAME)-linux-amd64 ./cmd/...
build-darwin:
GOOS=darwin GOARCH=arm64 go build $(LDFLAGS) -o bin/$(BINARY_NAME)-darwin-arm64 ./cmd/...
build-all: build-linux build-darwin
GoのクロスコンパイルはGOOSとGOARCH環境変数で制御され、単一のMakefileから複数のプラットフォーム用のバイナリを簡単に生成できます。
ベストプラクティス
- 依存関係を整理するために
go mod tidyターゲットを使用する - コード生成を使用する場合は
go generate ./...のgenerateターゲットを含める - 再現可能なビルドのためにビルドフラグに
-trimpathを追加する - 包括的なlintには
staticcheckまたはgolangci-lintを使用する
ユースケース
バージョンスタンプ、マルチプラットフォームバイナリ、一貫したCI/CDコマンドが必要なGoマイクロサービスやCLIツールのビルド、テスト、リリースワークフローを自動化する場合に使用します。