# Makefile for Yinli API # 变量定义 APP_NAME := yinli-api VERSION := $(shell git tag --sort=-version:refname | head -n 1 2>/dev/null || echo "1.0.0") BUILD_DIR := build DOCKER_DIR := docker DOC_DIR := doc # Go 相关变量 GO := go GOFMT := gofmt GOVET := go vet # Docker 相关变量 DOCKER := docker DOCKER_COMPOSE := docker-compose # 默认目标 .PHONY: help help: ## 显示帮助信息 @echo "可用的命令:" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' # 开发环境 .PHONY: dev dev: ## 启动开发环境 @echo "启动开发环境..." $(GO) run src/main.go -env=dev .PHONY: stage stage: ## 启动预发布环境 @echo "启动预发布环境..." $(GO) run src/main.go -env=stage .PHONY: prod prod: ## 启动生产环境 @echo "启动生产环境..." $(GO) run src/main.go -env=prod # 构建相关 .PHONY: build build: ## 构建应用程序 @echo "构建应用程序..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -ldflags="-w -s" -o $(BUILD_DIR)/$(APP_NAME) src/main.go .PHONY: build-windows build-windows: ## 构建Windows版本 @echo "构建Windows版本..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GO) build -ldflags="-w -s" -o $(BUILD_DIR)/$(APP_NAME).exe src/main.go .PHONY: build-mac build-mac: ## 构建macOS版本 @echo "构建macOS版本..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GO) build -ldflags="-w -s" -o $(BUILD_DIR)/$(APP_NAME)-mac src/main.go .PHONY: build-all build-all: build build-windows build-mac ## 构建所有平台版本 # 依赖管理 .PHONY: deps deps: ## 下载依赖 @echo "下载依赖..." $(GO) mod download .PHONY: deps-update deps-update: ## 更新依赖 @echo "更新依赖..." $(GO) mod tidy $(GO) get -u ./... # 代码质量 .PHONY: fmt fmt: ## 格式化代码 @echo "格式化代码..." $(GOFMT) -s -w . .PHONY: vet vet: ## 代码静态检查 @echo "代码静态检查..." $(GOVET) ./... .PHONY: check check: fmt vet ## 执行所有代码检查 # 测试相关 .PHONY: test test: ## 运行测试 @echo "运行测试..." $(GO) test -v ./... .PHONY: test-coverage test-coverage: ## 运行测试并生成覆盖率报告 @echo "运行测试并生成覆盖率报告..." @mkdir -p $(BUILD_DIR) $(GO) test -v -coverprofile=$(BUILD_DIR)/coverage.out ./... $(GO) tool cover -html=$(BUILD_DIR)/coverage.out -o $(BUILD_DIR)/coverage.html @echo "覆盖率报告已生成: $(BUILD_DIR)/coverage.html" .PHONY: test-race test-race: ## 运行竞态检测测试 @echo "运行竞态检测测试..." $(GO) test -race -v ./... .PHONY: benchmark benchmark: ## 运行基准测试 @echo "运行基准测试..." $(GO) test -bench=. -benchmem ./... # 文档生成 .PHONY: docs docs: ## 生成API文档 @echo "生成API文档..." @mkdir -p $(DOC_DIR)/dev $(DOC_DIR)/stage $(DOC_DIR)/prod @echo "请先安装 swag: go install github.com/swaggo/swag/cmd/swag@latest" @echo "然后运行: swag init -g src/main.go -o doc/dev --parseDependency --parseInternal" .PHONY: docs-serve docs-serve: docs ## 启动文档服务器 @echo "启动文档服务器..." @cd $(DOC_DIR) && python3 -m http.server 8081 # Docker 相关 .PHONY: docker-build docker-build: ## 构建Docker镜像 @echo "构建Docker镜像..." $(DOCKER) build -t $(APP_NAME):$(VERSION) -t $(APP_NAME):latest . .PHONY: docker-compose-dev docker-compose-dev: ## 生成开发环境Docker Compose文件 @echo "生成开发环境Docker Compose文件..." @mkdir -p $(DOCKER_DIR) @echo "version: '3.8'" > $(DOCKER_DIR)/docker-compose.dev.yml @echo "" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "services:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " yinli-api:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " build:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " context: .." >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " dockerfile: Dockerfile" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " ports:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - \"8080:8080\"" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " environment:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - APP_ENV=dev" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " depends_on:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - mysql" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - redis" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " volumes:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - ../config:/app/config:ro" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " networks:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - yinli-network" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " mysql:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " image: mysql:8.0" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " environment:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " MYSQL_ROOT_PASSWORD: sasasasa" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " MYSQL_DATABASE: yinli" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " ports:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - \"3306:3306\"" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " volumes:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - mysql_data:/var/lib/mysql" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - ../sql:/docker-entrypoint-initdb.d:ro" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " networks:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - yinli-network" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " redis:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " image: redis:7-alpine" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " ports:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - \"6379:6379\"" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " volumes:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - redis_data:/data" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " networks:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " - yinli-network" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "volumes:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " mysql_data:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " redis_data:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "networks:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " yinli-network:" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo " driver: bridge" >> $(DOCKER_DIR)/docker-compose.dev.yml @echo "开发环境Docker Compose文件已生成: $(DOCKER_DIR)/docker-compose.dev.yml" .PHONY: docker-up-dev docker-up-dev: docker-compose-dev ## 启动开发环境Docker容器 @echo "启动开发环境Docker容器..." cd $(DOCKER_DIR) && $(DOCKER_COMPOSE) -f docker-compose.dev.yml up -d .PHONY: docker-down docker-down: ## 停止并移除Docker容器 @echo "停止并移除Docker容器..." cd $(DOCKER_DIR) && $(DOCKER_COMPOSE) down .PHONY: docker-logs docker-logs: ## 查看Docker容器日志 @echo "查看Docker容器日志..." cd $(DOCKER_DIR) && $(DOCKER_COMPOSE) logs -f # 清理 .PHONY: clean clean: ## 清理构建文件 @echo "清理构建文件..." rm -rf $(BUILD_DIR) rm -rf $(DOC_DIR) $(GO) clean .PHONY: clean-docker clean-docker: ## 清理Docker资源 @echo "清理Docker资源..." $(DOCKER) system prune -f $(DOCKER) volume prune -f # 安装工具 .PHONY: install-tools install-tools: ## 安装开发工具 @echo "安装开发工具..." $(GO) install github.com/swaggo/swag/cmd/swag@latest $(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest # 全流程 .PHONY: all all: clean deps check test build docs ## 执行完整的构建流程 .PHONY: ci ci: deps check test-coverage ## CI流程 # 版本管理 .PHONY: version version: ## 显示版本信息 @echo "应用名称: $(APP_NAME)" @echo "版本: $(VERSION)" @echo "Go版本: $(shell $(GO) version)" # 默认目标 .DEFAULT_GOAL := help