Files
usernode/Makefile
T
cao.wangrenbo ae45aba607 feat(M0): 工程骨架 — Go 后端 + Vue3 前端脚手架
- Go 工程:cmd/usernode CLI(serve/migrate/admin create/reset-password/user otp)
  + internal/{config,model,service,system,auth,cron,api,router,server,pkg,webui}
- 配置:TOML + 环境变量覆盖(USERNODE_<SEC>_<FIELD>),config.example.toml
- 数据:GORM 双驱动(SQLite/MySQL)8 表模型,migrate 子命令可跑通
- 系统层:system.Manager 接口(useradd/userdel/passwd 白名单,dev dry-run)
- HTTP:Gin 路由骨架(/api/v1 + 501 占位),healthz,slog 结构化日志,优雅启停
- 前端:Vite + Vue3 + TS + Element Plus 最小可运行(web/),go:embed 打通
- 构建:deploy/Containerfile 多阶段单二进制镜像,web/Containerfile.dev 前端 dev
  镜像,Makefile(build/test/dev/web-build/image);go.mod 锁定 go 1.22
- 验证:go build/vet/test 通过;podman 镜像构建运行 healthz+embed 通过
2026-08-29 22:43:27 +08:00

90 lines
3.3 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.
# ws_usernode Makefile —— build / test / dev 工作流
# 代理:容器构建无法继承 proxychains 注入,通过 --build-arg 显式传递
# 宿主机代理环境变量(HTTP_PROXY/HTTPS_PROXY/ALL_PROXY/NO_PROXY)。
# ---------- 代理参数(供 podman build 使用) ----------
HTTP_PROXY_ARG := $(if $(HTTP_PROXY),--build-arg HTTP_PROXY=$(HTTP_PROXY),)
HTTPS_PROXY_ARG := $(if $(HTTPS_PROXY),--build-arg HTTPS_PROXY=$(HTTPS_PROXY),)
ALL_PROXY_ARG := $(if $(ALL_PROXY),--build-arg ALL_PROXY=$(ALL_PROXY),)
NO_PROXY_ARG := $(if $(NO_PROXY),--build-arg NO_PROXY=$(NO_PROXY),)
PROXY_ARGS := $(HTTP_PROXY_ARG) $(HTTPS_PROXY_ARG) $(ALL_PROXY_ARG) $(NO_PROXY_ARG)
NET_HOST := --network=host
GO ?= go
PODMAN ?= podman
BIN := bin/usernode
VERSION ?= 0.1.0-m0
LDFLAGS := -s -w -X main.version=$(VERSION)
GOFLAGS := -trimpath
# ---------- 后端 ----------
.PHONY: build
build: ## 构建 Go 二进制(后端,不含前端产物)
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/usernode
.PHONY: test
test: ## 运行全部 Go 测试
$(GO) test ./...
.PHONY: vet
vet: ## 静态检查
$(GO) vet ./...
.PHONY: run
run: build ## 本地运行(默认 config.toml,缺失则用默认配置)
./$(BIN) serve
.PHONY: migrate
migrate: build ## 数据库迁移
./$(BIN) migrate
# ---------- 前端 ----------
.PHONY: web-install
web-install: ## 容器内安装前端依赖(node:20-alpine),并初始化 node_modules volume
$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode-web-dev -f web/Containerfile.dev web/
$(PODMAN) run --rm $(NET_HOST) \
-v ws_usernode_node_modules:/app/node_modules \
ws-usernode-web-dev sh -c "ls node_modules >/dev/null && echo node_modules ready"
.PHONY: web-dev
web-dev: ## 前端 dev 容器(热开发,端口 5173;API 代理到 Go 后端)
$(PODMAN) run --rm -p 5173:5173 \
-v $(CURDIR)/web:/app \
-v ws_usernode_node_modules:/app/node_modules \
-e VITE_API_PROXY=http://host.containers.internal:8080 \
ws-usernode-web-dev
.PHONY: web-build
web-build: ## 容器内构建前端产物到 web/dist,并复制到 internal/webui/dist(供 go:embed
$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode-web-dev -f web/Containerfile.dev web/
$(PODMAN) run --rm $(NET_HOST) \
-v $(CURDIR)/web:/app \
-v ws_usernode_node_modules:/app/node_modules \
-v $(CURDIR)/internal/webui/dist:/embed/dist \
ws-usernode-web-dev sh -c "npm run build && cp -r dist/. /embed/dist/ && echo web-build ok"
# ---------- 镜像 / 分发 ----------
.PHONY: image
image: ## 构建单二进制容器镜像(deploy/Containerfile 多阶段)
$(PODMAN) build $(NET_HOST) $(PROXY_ARGS) -t ws-usernode:$(VERSION) -t ws-usernode:latest -f deploy/Containerfile .
.PHONY: build-embed
build-embed: web-build ## 构建含前端产物的 Go 二进制(web-build 后重新编译)
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/usernode
.PHONY: dev
dev: ## 开发提示
@echo "后端:make run 前端:make web-dev"
@echo "或:go run ./cmd/usernode serve --debug"
.PHONY: clean
clean: ## 清理构建产物
rm -rf bin web/dist
.PHONY: help
help: ## 显示帮助
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-14s\033[0m %s\n", $$1, $$2}'