.PHONY: build run docker-build docker-run docker-clean tar tar-mac # 变量定义 BINARY_NAME := dd-fiber-api BINARY_PATH := bin/$(BINARY_NAME) # 构建参数(可通过 make tar OS=darwin ARCH=arm64 等方式指定) OS ?= linux ARCH ?= amd64 # 创建必要的目录 init: mkdir -p bin mkdir -p deploy # 生成 Wire 代码 wire: @echo "生成 Wire 依赖注入代码..." @WIRE_BIN=$$(go env GOPATH)/bin/wire; \ if [ -f "$$WIRE_BIN" ]; then \ $$WIRE_BIN gen ./internal/wire; \ elif command -v wire >/dev/null 2>&1; then \ wire gen ./internal/wire; \ else \ echo "使用 go run 方式运行 Wire..."; \ go run github.com/google/wire/cmd/wire@latest gen ./internal/wire; \ fi @echo "✅ Wire 代码生成完成" # 构建项目 build: wire @echo "构建项目..." @mkdir -p bin @CGO_ENABLED=0 GOARCH=$(ARCH) GOOS=$(OS) go build -ldflags="-s -w" -o $(BINARY_PATH) . @echo "✅ 构建完成: $(BINARY_PATH)" # 运行服务(开发环境) run: @echo "启动服务..." @go run . -config config.yaml # 使用 Air 热重载运行(开发环境推荐) air: @echo "使用 Air 热重载启动服务..." @AIR_BIN=$$(go env GOPATH)/bin/air; \ if [ -f "$$AIR_BIN" ]; then \ $$AIR_BIN; \ elif command -v air >/dev/null 2>&1; then \ air; \ else \ echo "❌ Air 未安装,请运行: go install github.com/air-verse/air@latest"; \ echo "或者使用 make run 运行"; \ exit 1; \ fi # 打包部署(默认 Linux,可通过 OS=darwin ARCH=arm64 指定 macOS) tar: @if [ "$(OS)" = "darwin" ]; then \ echo "构建 macOS 版本 ($(ARCH))..."; \ echo "清理旧编译文件和生成代码..."; \ rm -rf bin/; \ rm -f internal/wire/wire_gen.go; \ echo "生成 Wire 依赖注入代码..."; \ WIRE_BIN=$$(go env GOPATH)/bin/wire; \ if [ -f "$$WIRE_BIN" ]; then \ $$WIRE_BIN gen ./internal/wire || exit 1; \ elif command -v wire >/dev/null 2>&1; then \ wire gen ./internal/wire || exit 1; \ else \ echo "使用 go run 方式运行 Wire..."; \ go run github.com/google/wire/cmd/wire@latest gen ./internal/wire || exit 1; \ fi; \ if [ ! -f "internal/wire/wire_gen.go" ]; then \ echo "❌ Wire 代码生成失败"; \ exit 1; \ fi; \ echo "✅ Wire 代码生成完成"; \ echo "编译 macOS 版本 ($(ARCH))..."; \ mkdir -p bin; \ CGO_ENABLED=0 GOOS=darwin GOARCH=$(ARCH) go build -ldflags="-s -w" -o $(BINARY_PATH) . || exit 1; \ if [ ! -f "$(BINARY_PATH)" ]; then \ echo "❌ 编译失败"; \ exit 1; \ fi; \ echo "✅ macOS 版本构建完成: $(BINARY_PATH)"; \ ls -lh $(BINARY_PATH); \ else \ echo "开始创建 Linux 部署包..."; \ if ! command -v docker >/dev/null 2>&1; then \ echo "❌ 未找到 Docker"; \ exit 1; \ fi; \ echo "清理旧编译文件和生成代码..."; \ rm -rf bin/; \ rm -f internal/wire/wire_gen.go; \ echo "生成 Wire 依赖注入代码..."; \ WIRE_BIN=$$(go env GOPATH)/bin/wire; \ if [ -f "$$WIRE_BIN" ]; then \ $$WIRE_BIN gen ./internal/wire || exit 1; \ elif command -v wire >/dev/null 2>&1; then \ wire gen ./internal/wire || exit 1; \ else \ echo "使用 go run 方式运行 Wire..."; \ go run github.com/google/wire/cmd/wire@latest gen ./internal/wire || exit 1; \ fi; \ if [ ! -f "internal/wire/wire_gen.go" ]; then \ echo "❌ Wire 代码生成失败"; \ exit 1; \ fi; \ echo "✅ Wire 代码生成完成"; \ echo "编译 Linux 版本 ($(ARCH))..."; \ mkdir -p bin; \ CGO_ENABLED=0 GOOS=linux GOARCH=$(ARCH) go build -ldflags="-s -w" -o $(BINARY_PATH) . || exit 1; \ if [ ! -f "$(BINARY_PATH)" ]; then \ echo "❌ 编译失败"; \ exit 1; \ fi; \ echo "✅ 编译完成: $(BINARY_PATH)"; \ ls -lh $(BINARY_PATH); \ echo "清理旧 Docker 镜像..."; \ docker rmi dd-fiber-api:latest 2>/dev/null || true; \ echo "构建容器镜像 (linux/amd64)..."; \ docker build --platform=linux/amd64 --no-cache -t dd-fiber-api:latest .; \ echo "导出部署包..."; \ mkdir -p deploy; \ rm -f deploy/dd-fiber-api.tar; \ docker save -o deploy/dd-fiber-api.tar dd-fiber-api:latest; \ echo "✅ 部署包创建完成: deploy/dd-fiber-api.tar"; \ ls -lh deploy/dd-fiber-api.tar; \ fi # 快速构建 macOS 版本(便捷方法) tar-mac: @$(MAKE) tar OS=darwin ARCH=arm64 # 清理构建产物 clean: @echo "清理构建产物..." @rm -rf bin/ @rm -f deploy/dd-fiber-api.tar @echo "✅ 清理完成" # Docker 构建(本地测试用) docker-build: @echo "构建 Docker 镜像..." @docker build -t dd-fiber-api:latest . @echo "✅ Docker 镜像构建完成" # Docker 运行(本地测试用) docker-run: @echo "运行 Docker 容器..." @docker run -d \ --name dd-fiber-api \ --restart=unless-stopped \ -p 8080:8080 \ -p 8081:8081 \ -v $(PWD)/deploy/config.yaml:/app/data/config/config.yaml:ro \ -v $(PWD)/deploy/storage:/app/data/storage:ro \ dd-fiber-api:latest @echo "✅ 容器已启动" # 清理 Docker 资源 docker-clean: @echo "清理 Docker 资源..." @docker stop dd-fiber-api 2>/dev/null || true @docker rm dd-fiber-api 2>/dev/null || true @docker rmi dd-fiber-api:latest 2>/dev/null || true @echo "✅ 清理完成"