.PHONY: all build run test clean docker swagger lint fmt vet # 应用名称 APP_NAME=ezops MAIN_FILE=cmd/main.go BUILD_DIR=build # Go 参数 GOCMD=go GOBUILD=$(GOCMD) build GOCLEAN=$(GOCMD) clean GOTEST=$(GOCMD) test GOGET=$(GOCMD) get GOMOD=$(GOCMD) mod # 版本信息 VERSION=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") BUILD_TIME=$(shell date +%Y-%m-%d_%H:%M:%S) GIT_COMMIT=$(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown") LDFLAGS=-ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -X main.GitCommit=$(GIT_COMMIT)" all: test build # 构建应用 build: @echo "Building $(APP_NAME)..." @mkdir -p $(BUILD_DIR) $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME) $(MAIN_FILE) @echo "Build complete: $(BUILD_DIR)/$(APP_NAME)" # 运行应用 run: $(GOCMD) run $(MAIN_FILE) # 开发模式运行(带热重载) dev: @which air > /dev/null || go install github.com/cosmtrek/air@latest air # 运行测试 test: $(GOTEST) -v ./... # 运行测试并生成覆盖率报告 test-coverage: $(GOTEST) -v -coverprofile=coverage.out ./... $(GOCMD) tool cover -html=coverage.out -o coverage.html @echo "Coverage report generated: coverage.html" # 清理构建产物 clean: $(GOCLEAN) @rm -rf $(BUILD_DIR) @rm -f coverage.out coverage.html @echo "Clean complete" # 下载依赖 deps: $(GOMOD) download $(GOMOD) tidy # 更新依赖 update-deps: $(GOGET) -u ./... $(GOMOD) tidy # 生成 Swagger 文档 swagger: @which swag > /dev/null || go install github.com/swaggo/swag/cmd/swag@latest swag init -g $(MAIN_FILE) @echo "Swagger docs generated" # 代码格式化 fmt: $(GOCMD) fmt ./... # 代码检查 vet: $(GOCMD) vet ./... # 运行 linter lint: @which golangci-lint > /dev/null || go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest golangci-lint run # 安全检查 security: @which gosec > /dev/null || go install github.com/securego/gosec/v2/cmd/gosec@latest gosec ./... # 构建 Docker 镜像 docker-build: docker build -t $(APP_NAME):$(VERSION) -t $(APP_NAME):latest . # 运行 Docker 容器 docker-run: docker run -p 8080:8080 -v $(PWD)/config.yaml:/root/config.yaml $(APP_NAME):latest # 停止 Docker 容器 docker-stop: docker stop $(shell docker ps -q --filter ancestor=$(APP_NAME)) # 数据库迁移 migrate: $(GOCMD) run $(MAIN_FILE) migrate # 初始化数据库 init-db: @echo "Initializing database..." @mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS ezops CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>/dev/null || true @echo "Database initialized" # 生成 Mock 数据 mock: $(GOCMD) run scripts/mock.go # 查看帮助 help: @echo "Available targets:" @echo " make build - Build the application" @echo " make run - Run the application" @echo " make dev - Run with hot reload" @echo " make test - Run tests" @echo " make test-coverage - Run tests with coverage" @echo " make clean - Clean build artifacts" @echo " make deps - Download dependencies" @echo " make update-deps - Update dependencies" @echo " make swagger - Generate Swagger docs" @echo " make fmt - Format code" @echo " make vet - Run go vet" @echo " make lint - Run linter" @echo " make security - Run security check" @echo " make docker-build - Build Docker image" @echo " make docker-run - Run Docker container" @echo " make init-db - Initialize database" @echo " make help - Show this help"