Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
164 lines (141 loc) · 5.94 KB
/
Copy pathMakefile
File metadata and controls
164 lines (141 loc) · 5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# ProMgr — 顶层 Makefile
#
# 设计目标:
# - 一个新人 `make verify-foundation` 即可完成 Phase 1 烟雾测试
# - 默认目标 `help` 列出所有可用靶子
# - 用 phony 标记所有 target,避免与同名文件冲突
# - 不假设 make 一定是 GNU Make 4 —— 3.82 也能跑
# 默认 shell:bash(Windows 上若用 mingw32-make 也需 bash 可用)
SHELL := /bin/bash
# 防止某些 env 偷走工具链
export GOTOOLCHAIN ?= local
# —— 路径 ———
BIN_DIR := bin
SERVER_BIN := $(BIN_DIR)/server
CMD_DIR := cmd/server
SWAG_OUT_DIR := docs/swagger
# —— 工具链 ——
GO := go
MKDIR := mkdir -p
RM := rm -rf
FILE := file
# —— 探测:mingw32-make 与 gnu make 不互相替代 ——
# Windows 上若有 `make` 但其实是 mingw32-make 4.x,依然可用。
# 命令可用性以命令自身查询为准,不做 shell 探测。
.DEFAULT_GOAL := help
.PHONY: help
help: ## 列出本 Makefile 全部目标
@echo "ProMgr Makefile —— Phase 1 tools"
@echo ""
@echo "Usage:"
@echo " make <target>"
@echo ""
@echo "Phases:"
@echo " ensure-web-dist 确保 web/dist/ 至少含 placeholder index.html"
@echo " tidy go mod tidy"
@echo " test go test ./... -count=1"
@echo " layering 跑 scripts/check_layering.sh"
@echo " check-no-net-http 跑 scripts/check_no_net_http.sh(service 禁 net/http import)"
@echo " smoke-cgo 探测依赖链中是否有 cgo SQLite 驱动"
@echo " build 一键 release: web-build → 嵌入 → CGO_ENABLED=0 cross-build linux/amd64"
@echo " build-dev 本地开发构建(占位 web-dist + 本地平台 go build)"
@echo " cross-build-linux 前置 web-build,CGO_ENABLED=0 交叉编译到 linux/amd64"
@echo " run 构建并本地运行(build-dev,Ctrl-C 优雅停机)"
@echo " web-build 构建前端(npm ci + vite build)"
@echo " swag 生成 Swagger JSON/YAML"
@echo " verify-foundation 串跑 Phase 1 全套验证(test + layering + smoke-cgo + cross-build)"
@echo " verify 串跑 Phase 7 全套验证(test + layering + check-no-net-http + cross-build-linux)"
@echo " clean 清理 bin/ 与 data.db"
.PHONY: ensure-web-dist
ensure-web-dist: ## 确保 web/dist/ 至少含 placeholder index.html
@test -f web/dist/index.html || { \
echo "creating web/dist/index.html placeholder"; \
mkdir -p web/dist; \
{ echo '<!doctype html><html><body><h1>ProMgr (placeholder)</h1></body></html>'; } > web/dist/index.html; \
}
@test -f web/dist/.gitkeep || : > web/dist/.gitkeep
@echo "web/dist OK"
.PHONY: tidy
tidy: ## go mod tidy
$(GO) mod tidy
.PHONY: test
test: ## go test ./... -count=1
$(GO) test ./... -count=1
.PHONY: test-verbose
test-verbose: ## go test ./... -count=1 -v
$(GO) test ./... -count=1 -v
.PHONY: layering
layering: ## scripts/check_layering.sh
bash scripts/check_layering.sh
.PHONY: check-no-net-http
check-no-net-http: ## scripts/check_no_net_http.sh(service 禁 net/http import)
bash scripts/check_no_net_http.sh
.PHONY: smoke-cgo
smoke-cgo: ## 探测依赖链中是否含有 cgo SQLite 驱动(mattn / gorm.io/driver/sqlite)
@echo "checking for forbidden cgo SQLite drivers..."
@bad=$$($(GO) list -deps ./... 2>/dev/null | grep -E "github.com/mattn/go-sqlite3|gorm.io/driver/sqlite" || true); \
if [[ -n "$$bad" ]]; then \
echo "FAIL: cgo drivers present:"; \
echo "$$bad"; \
exit 1; \
else \
echo "OK: no cgo SQLite drivers in dependency chain"; \
fi
.PHONY: build
build: web-build ensure-web-dist tidy ## 一键 release: web-build → 嵌入 → CGO_ENABLED=0 cross-build linux/amd64
@mkdir -p $(BIN_DIR)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -o $(BIN_DIR)/server-linux-amd64 ./$(CMD_DIR)
@echo "built release: $(BIN_DIR)/server-linux-amd64"
@if command -v $(FILE) >/dev/null 2>&1; then \
$(FILE) $(BIN_DIR)/server-linux-amd64; \
else \
echo "NOTE: \`file\` not on PATH; skipping format verification"; \
fi
.PHONY: build-dev
build-dev: ensure-web-dist tidy ## 本地开发构建(占位 web-dist + 本地平台 go build)
@mkdir -p $(BIN_DIR)
$(GO) build -o $(SERVER_BIN) ./$(CMD_DIR)
@echo "built dev: $(SERVER_BIN)"
.PHONY: cross-build-linux
cross-build-linux: web-build ensure-web-dist tidy ## 前置 web-build,CGO_ENABLED=0 交叉编译到 linux/amd64
@mkdir -p $(BIN_DIR)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GO) build -o $(BIN_DIR)/server-linux-amd64 ./$(CMD_DIR)
@echo "built: $(BIN_DIR)/server-linux-amd64"
@if command -v $(FILE) >/dev/null 2>&1; then \
$(FILE) $(BIN_DIR)/server-linux-amd64; \
else \
echo "NOTE: \`file\` not on PATH; skipping format verification"; \
fi
.PHONY: run
run: build-dev ## 构建并本地运行(build-dev,Ctrl-C 优雅停机)
./$(SERVER_BIN)
.PHONY: web-build
web-build: ## 构建前端(要求 Node.js 已装;Phase 2 之前只跑占位)
@echo "前端构建 —— 要求 Node.js 可用"
@if command -v npm >/dev/null 2>&1; then \
cd web && npm ci && npm run build; \
else \
echo "npm not found; skipping web build (Phase 1 仅占位)"; \
fi
.PHONY: swag
swag: ## 生成 Swagger 文档(要求 swag CLI 已安装)
@if command -v swag >/dev/null 2>&1; then \
swag init -g cmd/server/main.go -o $(SWAG_OUT_DIR); \
echo "swagger docs generated under $(SWAG_OUT_DIR)"; \
else \
echo "swag CLI not installed; skipping"; \
echo "install with: go install github.com/swaggo/swag/cmd/swag@v1.16.4"; \
fi
.PHONY: verify-foundation
verify-foundation: test layering smoke-cgo cross-build-linux ## Phase 1 全套验证
@echo ""
@echo "==== verify-foundation: ALL GREEN ===="
.PHONY: verify
verify: test layering check-no-net-http cross-build-linux ## Phase 7 全套验证(test + layering + net/http 守卫 + cross-build)
@echo ""
@echo "==== verify: ALL GREEN ===="
.PHONY: clean
clean: ## 清理 bin/ 与 data.db
-$(RM) $(BIN_DIR)
-$(RM) data.db data.db-shm data.db-wal
@echo "cleaned"