live-sfu-demo/Makefile

179 lines
6.7 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SyncLive — Makefile
# 对标 SyncTV 的 SFU 分流服务(SRS 主干 + Cloudflare/CND 分发)
SHELL := /bin/bash
.DEFAULT_GOAL := help
# ── 变量 ──────────────────────────────────────────────
BIN := server
CMD := ./cmd/server
WEB_DIR := web
STATIC_DIR := internal/server/static
PROTO_DIR := api
GEN_DIR := gen
COMPOSE_FILE := deploy/docker-compose.yml
GO ?= go
PNPM ?= pnpm
# 从 .env 注入端口(若存在),否则用默认值
-include .env
export
HTTP_PORT ?= 8088
GRPC_PORT ?= 9090
GOFLAGS ?= -trimpath
LDFLAGS ?= -s -w
CGO_ENABLED ?= 1
# ── 帮助 ──────────────────────────────────────────────
.PHONY: help
help: ## 显示可用目标
@echo "SyncLive — make 帮助"
@echo ""
@echo "Usage: make [target]"
@echo ""
@grep -h -E '^[a-zA-Z0-9_.-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-18s\033[0m %s\n",$$1,$$2}'
@echo ""
@echo "示例:"
@echo " make env # 首次初始化 .env"
@echo " make srs-up # 启动本地 SRS 主干"
@echo " make dev # 热启动控制面 (go run)"
@echo " make build # 前端 + 后端完整构建"
@echo " make test check # 质量门禁"
# ── 环境 ──────────────────────────────────────────────
.PHONY: env
env: ## 若无 .env 则从 .env.example 复制
@if [ -f .env ]; then \
echo ".env 已存在,跳过"; \
else \
cp .env.example .env; \
echo ".env 已从 .env.example 创建,请按需填写 JWT_SECRET / CF_* / CDN_*"; \
fi
# ── 依赖安装 ──────────────────────────────────────────
.PHONY: install install-go install-web
install: install-go install-web ## 安装 Go 与前端依赖
install-go: ## go mod download
$(GO) mod download
install-web: ## pnpm install (web/)
@if ! command -v $(PNPM) >/dev/null 2>&1; then \
echo "error: pnpm 未安装,请先安装 https://pnpm.io/installation"; exit 1; fi
cd $(WEB_DIR) && $(PNPM) install
# ── 前端 ──────────────────────────────────────────────
.PHONY: web web-build web-dev web-typecheck web-preview web-clean
web: web-build ## alias: web = web-build
web-build: ## 构建前端到 $(STATIC_DIR)(被 Go embed)
@if ! command -v $(PNPM) >/dev/null 2>&1; then \
echo "error: pnpm 未安装"; exit 1; fi
cd $(WEB_DIR) && $(PNPM) run build
@echo "web build -> $(STATIC_DIR)"
web-dev: ## 启动 Vite 开发服务器 (5173,反代到 :$(HTTP_PORT))
@if ! command -v $(PNPM) >/dev/null 2>&1; then \
echo "error: pnpm 未安装"; exit 1; fi
cd $(WEB_DIR) && $(PNPM) run dev
web-typecheck: ## 前端类型检查
cd $(WEB_DIR) && $(PNPM) run typecheck
web-preview: ## 预览前端构建产物
cd $(WEB_DIR) && $(PNPM) run preview
web-clean: ## 清理前端构建产物与依赖
rm -rf $(WEB_DIR)/node_modules
rm -rf $(WEB_DIR)/dist
# ── 后端构建 / 运行 ───────────────────────────────────
.PHONY: build build-go build-all run dev
build: web-build build-go ## 完整构建:前端 + Go 二进制
build-go: ## 仅构建 Go 二进制 -> ./$(BIN)(含前端 embed)
CGO_ENABLED=$(CGO_ENABLED) $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) $(CMD)
@echo "built -> ./$(BIN) (HTTP :$(HTTP_PORT) gRPC :$(GRPC_PORT))"
build-all: build ## alias: build-all = build
run: ## go run ./cmd/server(不等前端构建)
$(GO) run $(CMD)
dev: ## 开发态运行(等价于 run,打印后端链路信息)
@echo "starting sync-live (HTTP :$(HTTP_PORT) gRPC :$(GRPC_PORT)) ..."
$(GO) run $(CMD)
# ── 协议 / 代码生成 ───────────────────────────────────
.PHONY: proto gen buf
proto: gen ## alias: proto = gen
gen: ## buf generate api(需 buf CLI,已含 go/go-grpc 插件)
@if command -v buf >/dev/null 2>&1; then \
buf generate $(PROTO_DIR); \
echo "proto generated -> $(GEN_DIR)/"; \
elif command -v docker >/dev/null 2>&1; then \
echo "buf 未安装,改用 docker (bufbuild/buf) ..."; \
docker run --rm -v "$$(pwd):/workspace" -w /workspace bufbuild/buf generate $(PROTO_DIR); \
else \
echo "error: 未找到 buf,请安装 https://buf.build/docs/installation"; exit 1; fi
buf: gen ## alias: buf = gen
# ── 质量门禁 ──────────────────────────────────────────
.PHONY: fmt vet lint test tidy check
fmt: ## go fmt ./...
$(GO) fmt ./...
vet: ## go vet ./...
$(GO) vet ./...
lint: ## golangci-lint(若未安装则回退到 go vet)
@if command -v golangci-lint >/dev/null 2>&1; then \
golangci-lint run ./...; \
else \
echo "golangci-lint 未安装,跳过。安装: https://golangci-lint.run/welcome/install/"; \
echo "回退到 go vet ..."; \
$(GO) vet ./...; \
fi
test: ## go test ./...(含 -count=1)
$(GO) test ./... -count=1
tidy: ## go mod tidy
$(GO) mod tidy
check: fmt vet test ## 质量门禁:fmt + vet + test
# ── SRS / Docker ──────────────────────────────────────
.PHONY: srs-up srs-down srs-logs srs-restart compose-up compose-down docker-up docker-down
srs-up: ## 启动 SRS 主干(deploy/docker-compose.yml)
@SRS_CANDIDATE=$${SRS_CANDIDATE:-127.0.0.1} docker compose -f $(COMPOSE_FILE) up -d srs
@docker compose -f $(COMPOSE_FILE) ps
srs-down: ## 停止 SRS
docker compose -f $(COMPOSE_FILE) down
srs-logs: ## 查看 SRS 日志
docker compose -f $(COMPOSE_FILE) logs -f srs
srs-restart: ## 重启 SRS
docker compose -f $(COMPOSE_FILE) restart srs
compose-up: srs-up ## alias: compose-up = srs-up
compose-down: srs-down ## alias: compose-down = srs-down
docker-up: srs-up ## alias: docker-up = srs-up
docker-down: srs-down ## alias: docker-down = srs-down
# ── 清理 ──────────────────────────────────────────────
.PHONY: clean clean-all
clean: ## 清理 Go 构建产物与缓存(二进制、/tmp/sync-live)
rm -f $(BIN)
rm -rf /tmp/sync-live
$(GO) clean -cache -testcache 2>/dev/null || true
@echo "clean done."
clean-all: clean web-clean ## 深度清理:clean + 前端产物/依赖
rm -rf $(STATIC_DIR)/assets
@echo "clean-all done."