ヘルプターゲットで自己文書化するMakefile
インラインコメントからawkを使用してターゲットの説明を抽出・表示するヘルプターゲットで、自己文書化するMakefileを作成します。
Advanced Patterns
詳細な説明
自己文書化するMakefile
利用可能なすべてのターゲットと説明を表示するhelpターゲットにより、Makefileはより使いやすくなります。このパターンは特別なコメントとawkを使用してフォーマットされたヘルプ出力を生成します。
コメント規約
.DEFAULT_GOAL := help
build: ## アプリケーションバイナリをビルド
go build -o bin/app ./cmd/...
test: ## カバレッジ付きで全テストを実行
go test -v -cover ./...
lint: ## linterを実行(golangci-lint)
golangci-lint run ./...
clean: ## ビルド成果物を削除
rm -rf bin/ coverage.out
docker-build: ## Docker imageをビルド
docker build -t myapp .
help: ## このヘルプメッセージを表示
@awk 'BEGIN {FS = ":.*##"; printf "Usage:\n make \033[36m<target>\033[0m\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST)
仕組み
awkコマンドは:
- フィールドセパレータを
:.*##に設定 — コロンと##の間のすべて - ターゲット名の後に
:そして##コメントがある行にマッチ - 各ターゲット名(シアン色)とその説明を出力
$(MAKEFILE_LIST)はインクルードされたすべてのMakefileを含む組み込み変数
出力
makeまたはmake helpを実行すると以下が出力されます:
Usage:
make <target>
Targets:
build アプリケーションバイナリをビルド
test カバレッジ付きで全テストを実行
lint linterを実行(golangci-lint)
clean ビルド成果物を削除
docker-build Docker imageをビルド
help このヘルプメッセージを表示
デフォルトゴールの設定
.DEFAULT_GOAL := help
これによりhelpがデフォルトターゲットになり、引数なしでmakeを実行するとヘルプメッセージが表示されます。
カテゴリ分けされたヘルプ(上級)
build: ## [Build] アプリケーションをビルド
test: ## [Test] ユニットテストを実行
e2e: ## [Test] E2Eテストを実行
lint: ## [Quality] linterを実行
括弧内にカテゴリプレフィックスを追加し、大きなMakefileではawkスクリプトを変更してターゲットをカテゴリごとにグループ化します。
ユースケース
新しいチームメンバーやCI/CDドキュメントのためにMakefileを見つけやすくする場合。`make`を実行するだけでソースファイルを読まずにすべての利用可能なコマンドと説明が表示されます。