179 lines
6.7 KiB
Makefile
179 lines
6.7 KiB
Makefile
# 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."
|