.PHONY: help build build-ffi test clean check check-docs fmt lint install dev docker-build docker-up docker-down official-smoke bat-api-local-live-smoke build-go build-go-api build-go-cli test-go test-go-api test-go-ffi test-go-all # 默认目标 .DEFAULT_GOAL := help # 颜色输出 BLUE := \033[0;34m GREEN := \033[0;32m YELLOW := \033[0;33m NC := \033[0m # No Color help: ## 显示帮助信息 @echo "$(BLUE)BlueArchive Toolkit - Makefile 命令$(NC)" @echo "" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " $(GREEN)%-15s$(NC) %s\n", $$1, $$2}' # ============================================================================ # 构建相关 # ============================================================================ build: build-rust build-go ## 构建所有组件 build-rust: ## 构建 Rust 组件 @echo "$(BLUE)Building Rust workspace...$(NC)" cargo build --release --workspace build-ffi: ## 构建 bat-ffi release 库(cgo 链接依赖) @echo "$(BLUE)Building bat-ffi (release)...$(NC)" cargo build --release -p bat-ffi build-go: build-go-api ## 构建 Go 默认产物(bat-api bootstrap/分发;同步 CLI 请用 Rust bat) build-go-api: ## 构建 bat-api(资源 bootstrap/分发 HTTP,无 FFI) @echo "$(BLUE)Building bat-api (resource bootstrap + distribution)...$(NC)" @mkdir -p bin go build -o bin/bat-api ./cmd/bat-api build-go-cli: build-ffi ## 构建试验性 Go CLI → bin/bat-go(禁止命名为 bat) @echo "$(BLUE)Building experimental Go CLI as bin/bat-go...$(NC)" @mkdir -p bin @if [ -f cmd/bat/main.go ]; then \ go build -o bin/bat-go ./cmd/bat; \ else \ echo "$(YELLOW)experimental cmd/bat missing, skipping...$(NC)"; \ fi install: build-go-api ## 安装 bat-api 到 GOPATH/bin(不安装名为 bat 的 Go 二进制) @echo "$(BLUE)Installing bat-api...$(NC)" go install ./cmd/bat-api # ============================================================================ # 测试相关 # ============================================================================ test: test-rust test-go ## 运行所有测试 test-rust: ## 运行 Rust 测试 @echo "$(BLUE)Running Rust tests...$(NC)" cargo test --workspace test-go: test-go-api ## 默认 Go 门禁(无 FFI;见 GO_STATUS.md) test-go-api: ## 纯 Go 测试:internal/api + backendrpc @echo "$(BLUE)Running pure Go tests (api + backendrpc)...$(NC)" go test ./internal/api/... ./internal/backendrpc/... test-go-ffi: build-ffi ## 含 FFI/试验 CLI 的 Go 测试 @echo "$(BLUE)Running Go tests including FFI packages...$(NC)" go test ./... test-go-all: test-go-api test-go-ffi ## 全部 Go 测试 bench: ## 运行性能基准测试 @echo "$(BLUE)Running benchmarks...$(NC)" cargo bench --workspace go test -bench=. -benchmem ./... official-smoke: ## 运行真实官方全量拉取 smoke(默认写入 /tmp 隔离目录) @echo "$(BLUE)Running official full pull smoke...$(NC)" ./scripts/official-full-pull-smoke.sh bat-api-local-live-smoke: ## 在同一临时主机环境联调 Rust bat.sock 与 Go bat-api @echo "$(BLUE)Running local bat/bat-api live smoke...$(NC)" ./scripts/bat-api-local-live-smoke.sh # ============================================================================ # 代码质量 # ============================================================================ check: check-rust check-go check-docs ## 检查代码和状态文档(不编译) check-rust: ## 检查 Rust 代码 @echo "$(BLUE)Checking Rust code...$(NC)" cargo check --workspace check-go: ## 检查 Go 代码 @echo "$(BLUE)Checking Go code...$(NC)" go vet ./... check-docs: ## 检查权威状态文档与占位目录声明 @echo "$(BLUE)Checking documentation status claims...$(NC)" bash scripts/check-doc-status.sh fmt: fmt-rust fmt-go ## 格式化所有代码 fmt-rust: ## 格式化 Rust 代码 @echo "$(BLUE)Formatting Rust code...$(NC)" cargo fmt --all fmt-go: ## 格式化 Go 代码 @echo "$(BLUE)Formatting Go code...$(NC)" go fmt ./... lint: lint-rust lint-go ## 运行所有 Linter lint-rust: ## Rust Clippy 检查 @echo "$(BLUE)Running Clippy...$(NC)" cargo clippy --workspace --all-targets -- -D warnings lint-go: ## Go Linter 检查 @echo "$(BLUE)Running golangci-lint...$(NC)" @command -v golangci-lint >/dev/null 2>&1 || { echo "$(YELLOW)golangci-lint not installed, skipping...$(NC)"; exit 0; } @if [ -n "$$(go list ./... 2>/dev/null)" ]; then \ golangci-lint run ./...; \ else \ echo "$(YELLOW)No Go packages yet, skipping...$(NC)"; \ fi # ============================================================================ # 清理 # ============================================================================ clean: ## 清理构建产物 @echo "$(BLUE)Cleaning build artifacts...$(NC)" cargo clean rm -rf bin/ go clean # ============================================================================ # 开发环境 # ============================================================================ dev: ## 启动开发环境(数据库等) @echo "$(BLUE)Starting development environment...$(NC)" docker compose -f deployments/docker-compose.dev.yml up -d dev-stop: ## 停止开发环境 @echo "$(BLUE)Stopping development environment...$(NC)" docker compose -f deployments/docker-compose.dev.yml down # ============================================================================ # Docker # ============================================================================ docker-build: ## 构建 Docker 镜像 @echo "$(BLUE)Building Docker images...$(NC)" docker compose -f deployments/docker-compose.yml build docker-up: ## 启动 Docker 容器 @echo "$(BLUE)Starting Docker containers...$(NC)" docker compose -f deployments/docker-compose.yml up -d docker-down: ## 停止 Docker 容器 @echo "$(BLUE)Stopping Docker containers...$(NC)" docker compose -f deployments/docker-compose.yml down # ============================================================================ # 依赖管理 # ============================================================================ deps: ## 安装/更新依赖 @echo "$(BLUE)Updating dependencies...$(NC)" go mod download cargo fetch tidy: ## 整理依赖 @echo "$(BLUE)Tidying dependencies...$(NC)" go mod tidy cargo update --workspace # ============================================================================ # 文档 # ============================================================================ docs: ## 生成文档 @echo "$(BLUE)Generating documentation...$(NC)" cargo doc --workspace --no-deps --open # ============================================================================ # CI/CD # ============================================================================ ci: fmt lint test ## 运行 CI 检查(本地模拟) @echo "$(GREEN)✓ All CI checks passed!$(NC)"