バージョン注入を持つ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のクロスコンパイルはGOOSGOARCH環境変数で制御され、単一のMakefileから複数のプラットフォーム用のバイナリを簡単に生成できます。

ベストプラクティス

  • 依存関係を整理するためにgo mod tidyターゲットを使用する
  • コード生成を使用する場合はgo generate ./...generateターゲットを含める
  • 再現可能なビルドのためにビルドフラグに-trimpathを追加する
  • 包括的なlintにはstaticcheckまたはgolangci-lintを使用する

ユースケース

バージョンスタンプ、マルチプラットフォームバイナリ、一貫したCI/CDコマンドが必要なGoマイクロサービスやCLIツールのビルド、テスト、リリースワークフローを自動化する場合に使用します。

試してみる — Makefile Generator

フルツールを開く