SHELL := /bin/bash
SERVER_DIR := server
WEB_DIR := app/web
BIN_DIR := bin
VERSION := $(shell sed -n 's/^var Version = "\(.*\)"/\1/p' $(SERVER_DIR)/internal/app/handler_setup.go)
NODE_VERSION := 24.20.0
TARGET_GOOS ?= $(shell go env GOOS)
TARGET_GOARCH ?= $(shell go env GOARCH)
WEB_RUNTIME := $(SERVER_DIR)/internal/webbundle/assets/web-runtime.tar.gz
LDFLAGS := -s -w -X 'knowforge/server/internal/app.Version=$(VERSION)'
.PHONY: all build check-node web-install web-build web-runtime server-build release-linux clean dev-web dev-server lint test
all: build
build: server-build
@echo ""
@echo "构建完成: $(BIN_DIR)/knowforge-server"
@echo ""
web-install: check-node
cd $(WEB_DIR) && pnpm install
check-node:
@test "$$(node -p 'process.versions.node')" = "$(NODE_VERSION)" || \
(echo "需要 Node.js $(NODE_VERSION),当前为 $$(node --version)" >&2; exit 1)
web-build: check-node
cd $(WEB_DIR) && NEXT_DIST_DIR=.next-build pnpm build
web-runtime: web-build
deploy/package-web-runtime.sh $(NODE_VERSION) $(TARGET_GOOS) $(TARGET_GOARCH) $(WEB_RUNTIME)
server-build: web-runtime
mkdir -p $(BIN_DIR)
cd $(SERVER_DIR) && go build -trimpath -ldflags "$(LDFLAGS)" -o ../$(BIN_DIR)/knowforge-server .
rm -f $(WEB_RUNTIME)
release-linux: web-build
mkdir -p $(BIN_DIR)
deploy/package-web-runtime.sh $(NODE_VERSION) linux amd64 $(WEB_RUNTIME)
cd $(SERVER_DIR) && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -trimpath -ldflags "$(LDFLAGS)" -o ../$(BIN_DIR)/knowforge-server-linux-amd64 .
rm -f $(WEB_RUNTIME)
test: lint
cd $(SERVER_DIR) && go vet ./... && go test ./...
cd $(WEB_DIR) && pnpm exec tsc --noEmit && pnpm test
lint: check-node
cd $(WEB_DIR) && CI=1 pnpm exec next lint
dev-web: check-node
cd $(WEB_DIR) && NEXT_PUBLIC_API_BASE=http://localhost:6969 KNOWFORGE_API_URL=http://localhost:6969 pnpm dev
dev-server:
cd $(SERVER_DIR) && KNOWFORGE_DATA=./data go run . -port 6969
clean:
rm -rf $(BIN_DIR) $(WEB_DIR)/.next $(WEB_DIR)/.next-build
rm -f $(WEB_RUNTIME)