# go-zero 生成風格 GO_ZERO_STYLE := go_zero GO ?= go GOFMT ?= gofmt GOFILES := $(shell find . -name '*.go' -not -path './generate/doc-generate/*') GO_DOC_DIR := generate/doc-generate GO_DOC_BIN := $(GO_DOC_DIR)/bin/go-doc API_ENTRY := ./generate/api/gateway.api DOC_OUT := ./docs/openapi GOCTL ?= goctl GOCTL_PKG := github.com/zeromicro/go-zero/tools/goctl@latest GOLANGCI_PKG := github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.12.2 .DEFAULT_GOAL := help .PHONY: help tools gen-api build-go-doc gen-doc test fmt lint lint-fix fix check run help: ## 顯示可用指令 @echo "Gateway Makefile" @echo "" @echo "首次開發:" @echo " make tools 安裝 goctl、goimports、golangci-lint(寫入 \$$GOPATH/bin)" @echo " go mod download" @echo "" @echo "常用:" @grep -E '^[a-zA-Z0-9_-]+:.*## ' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*## "}; {printf " make %-14s %s\n", $$1, $$2}' tools: ## 安裝 goctl、goimports、golangci-lint(需 Go,且 GOPATH/bin 在 PATH) @command -v $(GOCTL) >/dev/null 2>&1 || (echo ">> installing goctl" && $(GO) install $(GOCTL_PKG)) @command -v goimports >/dev/null 2>&1 || (echo ">> installing goimports" && $(GO) install golang.org/x/tools/cmd/goimports@latest) @command -v golangci-lint >/dev/null 2>&1 || (echo ">> installing golangci-lint" && $(GO) install $(GOLANGCI_PKG)) @echo "tools OK" @echo " goctl: $$(goctl --version 2>/dev/null || echo missing)" @echo " golangci-lint: $$(golangci-lint version 2>/dev/null | head -1 || echo missing)" gen-api: tools ## 由 .api 生成 handler / logic / types(自訂 handler 模板) $(GOCTL) api go -api $(API_ENTRY) -dir . -style $(GO_ZERO_STYLE) -home generate/goctl build-go-doc: ## 編譯 go-doc(OpenAPI 文件生成器) @echo ">> building $(GO_DOC_BIN)" @mkdir -p $(GO_DOC_DIR)/bin @cd $(GO_DOC_DIR) && $(GO) build -o bin/go-doc ./cmd/go-doc gen-doc: build-go-doc ## 從 .api 生成 OpenAPI 3.0 YAML @mkdir -p $(DOC_OUT) $(GO_DOC_BIN) -a $(API_ENTRY) -d $(DOC_OUT) -f gateway -s openapi3.0 -y @echo "Generated: $(DOC_OUT)/gateway.yaml" test: ## 執行測試 $(GO) test ./... fmt: ## gofmt + goimports(不含 lint) $(GOFMT) -s -w $(GOFILES) @command -v goimports >/dev/null 2>&1 && goimports -w . || (echo "goimports not found; run: make tools" && exit 1) lint: ## golangci-lint 靜態檢查(先 make tools) @command -v golangci-lint >/dev/null 2>&1 || (echo "golangci-lint not found; run: make tools" && exit 1) golangci-lint run ./... lint-fix: ## 自動修正可修的 lint / formatter 問題(見 .golangci.yml) @command -v golangci-lint >/dev/null 2>&1 || (echo "golangci-lint not found; run: make tools" && exit 1) golangci-lint run --fix ./... fix: fmt lint-fix lint ## 格式化 + 自動修 lint + 再檢查(提交前建議) check: fix test ## 提交 / PR 前完整檢查(fmt、lint、test) run: ## 啟動 Gateway(etc/gateway.yaml) $(GO) run gateway.go -f etc/gateway.yaml