# FTS Service Makefile # 变量定义 APP_NAME := fts VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "v1.0.0") BUILD_TIME := $(shell date +%Y-%m-%d\ %H:%M:%S) GIT_COMMIT := $(shell git rev-parse HEAD 2>/dev/null || echo "unknown") GO_VERSION := $(shell go version | awk '{print $$3}') # 构建标志 LDFLAGS := -ldflags "-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -X main.GitCommit=$(GIT_COMMIT) -w -s" BUILD_FLAGS := -trimpath $(LDFLAGS) # 目录 BUILD_DIR := build # Go环境变量 export GO111MODULE=on export GOPROXY=https://goproxy.cn,direct export GOPRIVATE=git.apinb.com/* export GONOPROXY=git.apinb.com/* export GOINSECURE=git.apinb.com/* export GONOSUMDB=git.apinb.com/* export GOEXPERIMENT=jsonv2 .PHONY: help help: ## 显示帮助信息 @echo "FTS Service - 可用的命令:" @echo "" @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) .PHONY: deps deps: ## 下载依赖 @echo "下载Go依赖..." go mod download go mod tidy .PHONY: build build: deps ## 构建应用 @echo "构建应用..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 go build $(BUILD_FLAGS) -o $(BUILD_DIR)/$(APP_NAME) ./cmd/main/main.go @echo "构建完成: $(BUILD_DIR)/$(APP_NAME)" .PHONY: build-linux build-linux: deps ## 构建Linux版本 @echo "构建Linux版本..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build $(BUILD_FLAGS) -o $(BUILD_DIR)/$(APP_NAME)-linux-amd64 ./cmd/main/main.go @echo "构建完成: $(BUILD_DIR)/$(APP_NAME)-linux-amd64" .PHONY: build-windows build-windows: deps ## 构建Windows版本 @echo "构建Windows版本..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build $(BUILD_FLAGS) -o $(BUILD_DIR)/$(APP_NAME)-windows-amd64.exe ./cmd/main/main.go @echo "构建完成: $(BUILD_DIR)/$(APP_NAME)-windows-amd64.exe" .PHONY: build-darwin build-darwin: deps ## 构建macOS版本 @echo "构建macOS版本..." @mkdir -p $(BUILD_DIR) CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build $(BUILD_FLAGS) -o $(BUILD_DIR)/$(APP_NAME)-darwin-amd64 ./cmd/main/main.go @echo "构建完成: $(BUILD_DIR)/$(APP_NAME)-darwin-amd64" .PHONY: build-all build-all: build-linux build-windows build-darwin ## 构建所有平台版本 .PHONY: run run: build ## 运行应用 @echo "启动应用..." ./$(BUILD_DIR)/$(APP_NAME) .PHONY: dev dev: ## 开发模式运行 @echo "开发模式启动..." go run ./cmd/main/main.go .PHONY: test test: ## 运行测试 @echo "运行测试..." go test -v ./... .PHONY: test-coverage test-coverage: ## 运行测试并生成覆盖率报告 @echo "运行测试覆盖率..." go test -v -coverprofile=coverage.out ./... go tool cover -html=coverage.out -o coverage.html @echo "覆盖率报告生成: coverage.html" .PHONY: lint lint: ## 运行代码检查 @echo "运行代码检查..." @if command -v golangci-lint >/dev/null 2>&1; then \ golangci-lint run; \ else \ echo "golangci-lint 未安装,使用go vet..."; \ go vet ./...; \ fi .PHONY: fmt fmt: ## 格式化代码 @echo "格式化代码..." go fmt ./... @if command -v goimports >/dev/null 2>&1; then \ goimports -w .; \ fi .PHONY: security security: ## 安全检查 @echo "运行安全检查..." @if command -v gosec >/dev/null 2>&1; then \ gosec ./...; \ else \ echo "gosec 未安装,请运行: go install github.com/securego/gosec/v2/cmd/gosec@latest"; \ fi .PHONY: docker-build docker-build: ## 构建Docker镜像 @echo "构建Docker镜像..." docker build -t $(APP_NAME):$(VERSION) . docker tag $(APP_NAME):$(VERSION) $(APP_NAME):latest .PHONY: docker-run docker-run: ## 运行Docker容器 @echo "运行Docker容器..." docker run -d --name $(APP_NAME) -p 8080:8080 $(APP_NAME):latest .PHONY: docker-stop docker-stop: ## 停止Docker容器 @echo "停止Docker容器..." docker stop $(APP_NAME) || true docker rm $(APP_NAME) || true .PHONY: clean clean: ## 清理构建文件 @echo "清理构建文件..." rm -rf $(BUILD_DIR) rm -f coverage.out coverage.html docker system prune -f .PHONY: install-tools install-tools: ## 安装开发工具 @echo "安装开发工具..." go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest go install golang.org/x/tools/cmd/goimports@latest go install github.com/securego/gosec/v2/cmd/gosec@latest .PHONY: mod-update mod-update: ## 更新依赖 @echo "更新依赖..." go get -u ./... go mod tidy .PHONY: version version: ## 显示版本信息 @echo "应用名称: $(APP_NAME)" @echo "版本: $(VERSION)" @echo "构建时间: $(BUILD_TIME)" @echo "Git提交: $(GIT_COMMIT)" @echo "Go版本: $(GO_VERSION)" .PHONY: all all: clean deps build test lint ## 执行完整的构建流程 # 默认目标 .DEFAULT_GOAL := help