.PHONY: all dev build test lint clean \ backend-build backend-run backend-dev backend-test backend-test-unit backend-test-integration backend-test-coverage \ backend-lint backend-clean backend-deps backend-generate \ backend-db-up backend-db-down backend-db-status backend-db-create \ test-mysql-up test-mysql-down test-mysql test-mysql-quick \ frontend-build frontend-dev frontend-test frontend-test-watch frontend-test-coverage frontend-test-e2e frontend-lint frontend-clean \ desktop-build desktop-build-mac desktop-build-win desktop-build-linux \ desktop-dev desktop-package-mac desktop-package-win desktop-package-linux desktop-clean \ desktop-prepare-frontend desktop-prepare-embedfs # ============================================ # 顶层便捷命令 # ============================================ dev: @echo "🚀 Starting development environment..." @$(MAKE) -j2 backend-dev frontend-dev build: backend-build frontend-build @echo "✅ Build complete" test: backend-test frontend-test @echo "✅ All tests passed" lint: backend-lint frontend-lint @echo "✅ Lint complete" all: build test lint # ============================================ # 后端 # ============================================ backend-build: cd backend && go build -o bin/server ./cmd/server backend-run: cd backend && go run ./cmd/server backend-dev: cd backend && go run ./cmd/server backend-test: cd backend && go test ./... -v backend-test-unit: cd backend && go test ./internal/... ./pkg/... -v backend-test-integration: cd backend && go test ./tests/... -v backend-test-coverage: cd backend && go test ./... -coverprofile=coverage.out cd backend && go tool cover -html=coverage.out -o coverage.html @echo "Coverage report generated: backend/coverage.html" backend-lint: cd backend && go tool golangci-lint run ./... backend-clean: rm -rf backend/bin/ backend/coverage.out backend/coverage.html backend-deps: cd backend && go mod tidy backend-generate: cd backend && go generate ./... backend-db-up: @echo "Running database migration up..." cd backend && goose -dir migrations/sqlite3 sqlite3 "$(DB_PATH)" up backend-db-down: @echo "Running database migration down..." cd backend && goose -dir migrations/sqlite3 sqlite3 "$(DB_PATH)" down backend-db-status: @echo "Checking database migration status..." cd backend && goose -dir migrations/sqlite3 sqlite3 "$(DB_PATH)" status backend-db-create: @read -p "Migration name: " name; \ cd backend && goose -dir migrations/sqlite create $$name sql; \ cd backend && goose -dir migrations/mysql create $$name sql # ============================================ # MySQL 专项测试 # ============================================ test-mysql-up: @echo "Starting MySQL test container..." cd backend/tests/mysql && docker-compose up -d @echo "Waiting for MySQL to be ready..." @for i in $$(seq 1 30); do \ if docker exec nex-mysql-test mysqladmin ping -h localhost -u root -ptestpass --silent 2>/dev/null; then \ echo "MySQL is ready!"; \ exit 0; \ fi; \ echo "Waiting... ($$i/30)"; \ sleep 1; \ done; \ echo "MySQL failed to start"; \ exit 1 test-mysql-down: @echo "Stopping MySQL test container..." cd backend/tests/mysql && docker-compose down -v test-mysql: test-mysql-up @echo "Running MySQL tests..." cd backend && go test -tags=mysql ./tests/mysql/... -v -count=1 $(MAKE) test-mysql-down test-mysql-quick: @echo "Running MySQL tests (without container management)..." cd backend && go test -tags=mysql ./tests/mysql/... -v -count=1 # ============================================ # 前端 # ============================================ frontend-build: cd frontend && bun install && bun run build frontend-dev: cd frontend && bun dev frontend-test: cd frontend && bun run test frontend-test-watch: cd frontend && bun run test:watch frontend-test-coverage: cd frontend && bun run test:coverage frontend-test-e2e: cd frontend && bun run test:e2e frontend-lint: cd frontend && bun run lint frontend-clean: rm -rf frontend/dist frontend/.next frontend/node_modules # ============================================ # 桌面应用 # ============================================ desktop-build: desktop-build-mac desktop-build-win desktop-build-linux @echo "✅ Desktop builds complete for all platforms" desktop-prepare-frontend: @echo "📦 Preparing frontend for desktop..." cd frontend && cp .env.desktop .env.production.local cd frontend && bun install && bun run build rm -f frontend/.env.production.local desktop-prepare-embedfs: @echo "📦 Preparing embedded filesystem..." rm -rf embedfs/assets embedfs/frontend-dist cp -r assets embedfs/assets cp -r frontend/dist embedfs/frontend-dist desktop-build-mac: desktop-prepare-frontend desktop-prepare-embedfs @echo "🍎 Building macOS..." cd backend && CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -o ../build/nex-mac-arm64 ./cmd/desktop cd backend && CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -o ../build/nex-mac-amd64 ./cmd/desktop desktop-build-win: desktop-prepare-frontend desktop-prepare-embedfs @echo "🪟 Building Windows..." cd backend && CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -ldflags "-H=windowsgui" -o ../build/nex-win-amd64.exe ./cmd/desktop desktop-build-linux: desktop-prepare-frontend desktop-prepare-embedfs @echo "🐧 Building Linux..." cd backend && CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o ../build/nex-linux-amd64 ./cmd/desktop desktop-dev: desktop-prepare-frontend desktop-prepare-embedfs @echo "🖥️ Starting desktop app in dev mode..." cd backend && go run ./cmd/desktop desktop-package-mac: ./scripts/build/package-macos.sh desktop-package-win: @echo "⚠️ Windows packaging not implemented yet" desktop-package-linux: @echo "⚠️ Linux packaging not implemented yet" desktop-clean: rm -rf build/ embedfs/assets embedfs/frontend-dist # ============================================ # 清理 # ============================================ clean: backend-clean frontend-clean desktop-clean @echo "✅ Clean complete"