# TYAPI Server Makefile # 应用信息 APP_NAME := tyapi-server VERSION := 1.0.0 BUILD_TIME := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") GIT_COMMIT := $(shell git rev-parse --short HEAD) GO_VERSION := $(shell go version | awk '{print $$3}') # 构建参数 LDFLAGS := -ldflags "-X main.version=$(VERSION) -X main.commit=$(GIT_COMMIT) -X main.date=$(BUILD_TIME)" BUILD_DIR := bin MAIN_PATH := cmd/api/main.go # Go 相关 GOCMD := go GOBUILD := $(GOCMD) build GOCLEAN := $(GOCMD) clean GOTEST := $(GOCMD) test GOGET := $(GOCMD) get GOMOD := $(GOCMD) mod GOFMT := $(GOCMD) fmt # Docker 相关 DOCKER_IMAGE := $(APP_NAME):$(VERSION) DOCKER_LATEST := $(APP_NAME):latest # 默认目标 .DEFAULT_GOAL := help ## 显示帮助信息 help: @echo "TYAPI Server Makefile" @echo "" @echo "使用方法: make [目标]" @echo "" @echo "可用目标:" @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) ## 安装依赖 deps: @echo "安装依赖..." $(GOMOD) download $(GOMOD) tidy ## 代码格式化 fmt: @echo "格式化代码..." $(GOFMT) ./... ## 代码检查 lint: @echo "代码检查..." @if command -v golangci-lint >/dev/null 2>&1; then \ golangci-lint run; \ else \ echo "golangci-lint 未安装,跳过代码检查"; \ fi ## 运行测试 test: @echo "运行测试..." $(GOTEST) -v -race -coverprofile=coverage.out ./... ## 生成测试覆盖率报告 coverage: test @echo "生成覆盖率报告..." $(GOCMD) tool cover -html=coverage.out -o coverage.html @echo "覆盖率报告已生成: coverage.html" ## 构建应用 (开发环境) build: @echo "构建应用..." @mkdir -p $(BUILD_DIR) $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME) $(MAIN_PATH) ## 构建生产版本 build-prod: @echo "构建生产版本..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -a -installsuffix cgo -o $(BUILD_DIR)/$(APP_NAME)-linux-amd64 $(MAIN_PATH) ## 交叉编译 build-all: @echo "交叉编译..." @mkdir -p $(BUILD_DIR) # Linux AMD64 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-linux-amd64 $(MAIN_PATH) # Linux ARM64 CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-linux-arm64 $(MAIN_PATH) # macOS AMD64 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-darwin-amd64 $(MAIN_PATH) # macOS ARM64 CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-darwin-arm64 $(MAIN_PATH) # Windows AMD64 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-windows-amd64.exe $(MAIN_PATH) ## 运行应用 run: build @echo "启动应用..." ./$(BUILD_DIR)/$(APP_NAME) ## 开发模式运行 (热重载) dev: @echo "开发模式启动..." @if command -v air >/dev/null 2>&1; then \ air; \ else \ echo "air 未安装,使用普通模式运行..."; \ $(GOCMD) run $(MAIN_PATH); \ fi ## 运行数据库迁移 migrate: build @echo "运行数据库迁移..." ./$(BUILD_DIR)/$(APP_NAME) -migrate ## 显示版本信息 version: build @echo "版本信息:" ./$(BUILD_DIR)/$(APP_NAME) -version ## 健康检查 health: build @echo "执行健康检查..." ./$(BUILD_DIR)/$(APP_NAME) -health ## 清理构建文件 clean: @echo "清理构建文件..." $(GOCLEAN) rm -rf $(BUILD_DIR) rm -f coverage.out coverage.html ## 创建 .env 文件 env: @if [ ! -f .env ]; then \ echo "创建 .env 文件..."; \ cp env.example .env; \ echo ".env 文件已创建,请根据需要修改配置"; \ else \ echo ".env 文件已存在"; \ fi ## 设置开发环境 setup: deps env @echo "设置开发环境..." @echo "1. 依赖已安装" @echo "2. .env 文件已创建" @echo "3. 请确保 PostgreSQL 和 Redis 正在运行" @echo "4. 运行 'make migrate' 创建数据库表" @echo "5. 运行 'make dev' 启动开发服务器" ## 构建 Docker 镜像 docker-build: @echo "构建 Docker 镜像..." docker build -t $(DOCKER_IMAGE) -t $(DOCKER_LATEST) . ## 运行 Docker 容器 docker-run: @echo "运行 Docker 容器..." docker run -d --name $(APP_NAME) -p 8080:8080 --env-file .env $(DOCKER_LATEST) ## 停止 Docker 容器 docker-stop: @echo "停止 Docker 容器..." docker stop $(APP_NAME) || true docker rm $(APP_NAME) || true ## 推送 Docker 镜像 docker-push: @echo "推送 Docker 镜像..." docker push $(DOCKER_IMAGE) docker push $(DOCKER_LATEST) ## 启动开发依赖服务 (Docker Compose) services-up: @echo "启动开发依赖服务..." @if [ -f docker-compose.dev.yml ]; then \ docker-compose -f docker-compose.dev.yml up -d; \ else \ echo "docker-compose.dev.yml 不存在"; \ fi ## 停止开发依赖服务 services-down: @echo "停止开发依赖服务..." @if [ -f docker-compose.dev.yml ]; then \ docker-compose -f docker-compose.dev.yml down; \ else \ echo "docker-compose.dev.yml 不存在"; \ fi ## 查看服务日志 logs: @echo "查看应用日志..." @if [ -f logs/app.log ]; then \ tail -f logs/app.log; \ else \ echo "日志文件不存在"; \ fi ## 生成 API 文档 docs: @echo "生成 API 文档..." @if command -v swag >/dev/null 2>&1; then \ swag init -g $(MAIN_PATH) -o docs/swagger; \ else \ echo "swag 未安装,跳过文档生成"; \ fi ## 性能测试 bench: @echo "运行性能测试..." $(GOTEST) -bench=. -benchmem ./... ## 内存泄漏检测 race: @echo "运行竞态条件检测..." $(GOTEST) -race ./... ## 安全扫描 security: @echo "运行安全扫描..." @if command -v gosec >/dev/null 2>&1; then \ gosec ./...; \ else \ echo "gosec 未安装,跳过安全扫描"; \ fi ## 生成模拟数据 mock: @echo "生成模拟数据..." @if command -v mockgen >/dev/null 2>&1; then \ echo "生成模拟数据..."; \ else \ echo "mockgen 未安装,请先安装: go install github.com/golang/mock/mockgen@latest"; \ fi ## 完整的 CI 流程 ci: deps fmt lint test build ## 完整的发布流程 release: ci build-all docker-build .PHONY: help deps fmt lint test coverage build build-prod build-all run dev migrate version health clean env setup docker-build docker-run docker-stop docker-push services-up services-down logs docs bench race security mock ci release