#!/bin/bash # ======================================== # MosDNS 多平台构建脚本 (带 Web UI) # 支持: Linux, Windows, macOS (amd64/arm64) # ======================================== set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # 显示欢迎信息 show_welcome() { clear 2>/dev/null || true # 允许 clear 失败 echo "" echo -e "${CYAN}╔════════════════════════════════════════════╗${NC}" echo -e "${CYAN}║ MosDNS 多平台构建工具 (带 Web UI) ║${NC}" echo -e "${CYAN}╚════════════════════════════════════════════╝${NC}" echo "" } # 检查命令是否存在 command_exists() { command -v "$1" >/dev/null 2>&1 } # 检查 Go 环境 check_go() { if ! command_exists go; then echo -e "${RED}❌ Go 未安装或不在 PATH 中${NC}" exit 1 fi echo -e "${GREEN}✅ Go 版本:${NC}" go version echo "" } # 检查并构建 Vue 前端 build_vue() { echo -e "${BLUE}[检查] Vue 前端资源...${NC}" if [ ! -f "web-ui/dist/index.html" ]; then echo -e "${YELLOW}⚠️ Vue 前端未构建,开始构建...${NC}" # 检查 Node.js if ! command_exists node; then echo -e "${RED}❌ Node.js 未安装,无法构建 Vue 前端${NC}" echo -e "${CYAN}💡 请安装 Node.js 或手动运行: cd web-ui && npm install && npm run build${NC}" exit 1 fi # 检查 npm if ! command_exists npm; then echo -e "${RED}❌ npm 未找到${NC}" exit 1 fi echo -e "${BLUE}[1/2] 安装 Vue 依赖...${NC}" cd web-ui if [ ! -d "node_modules" ]; then npm install if [ $? -ne 0 ]; then echo -e "${RED}❌ npm install 失败${NC}" cd .. exit 1 fi fi echo -e "${BLUE}[2/2] 构建 Vue 前端...${NC}" npm run build if [ $? -ne 0 ]; then echo -e "${RED}❌ Vue 构建失败${NC}" cd .. exit 1 fi cd .. echo -e "${GREEN}✅ Vue 前端构建完成${NC}" else echo -e "${GREEN}✅ Vue 前端资源已存在${NC}" fi echo "" } # 显示平台选择菜单 show_menu() { show_welcome echo "请选择要编译的平台:" echo "" echo -e " ${GREEN}[1]${NC} Linux AMD64 (x86_64 服务器)" echo -e " ${GREEN}[2]${NC} Linux ARM64 (树莓派、ARM 服务器)" echo -e " ${GREEN}[3]${NC} Windows AMD64 (Windows 64位)" echo -e " ${GREEN}[4]${NC} macOS AMD64 (Intel Mac)" echo -e " ${GREEN}[5]${NC} macOS ARM64 (Apple Silicon M1/M2/M3)" echo "" echo -e " ${YELLOW}[6]${NC} 编译所有 Linux 版本 (AMD64 + ARM64)" echo -e " ${YELLOW}[7]${NC} 编译所有 macOS 版本 (AMD64 + ARM64)" echo -e " ${YELLOW}[8]${NC} 编译所有 Windows 版本 (仅 AMD64)" echo "" echo -e " ${CYAN}[A]${NC} 编译全部平台 (推荐用于发布)" echo "" echo -e " ${RED}[0]${NC} 退出" echo "" echo "════════════════════════════════════════════" echo "" } # 初始化构建环境 init_build() { echo "" echo "════════════════════════════════════════════" echo "" echo -e "${BLUE}[准备] 设置构建参数...${NC}" BUILD_TIME=$(date '+%Y-%m-%d %H:%M:%S') VERSION="v5.0.0-webui" OUTPUT_DIR="dist" # 创建输出目录 mkdir -p "$OUTPUT_DIR" echo " 版本: $VERSION" echo " 构建时间: $BUILD_TIME" echo " 输出目录: $OUTPUT_DIR/" echo "" export CGO_ENABLED=0 LDFLAGS="-s -w -X 'main.version=$VERSION' -X 'main.buildTime=$BUILD_TIME'" echo -e "${BLUE}[开始] 编译中...${NC}" echo "" BUILD_FAILED=0 } # 单平台编译函数 build_platform() { local GOOS=$1 local GOARCH=$2 local OUTPUT_NAME=$3 local DISPLAY_NAME=$4 echo -e "${CYAN}🔨 构建 $DISPLAY_NAME...${NC}" GOOS=$GOOS GOARCH=$GOARCH go build -ldflags="$LDFLAGS" -o "$OUTPUT_DIR/$OUTPUT_NAME" . if [ $? -eq 0 ]; then echo -e " ${GREEN}✅ $OUTPUT_NAME 构建成功${NC}" return 0 else echo -e " ${RED}❌ 构建失败${NC}" BUILD_FAILED=1 return 1 fi } # 显示构建结果 show_result() { echo "" echo "════════════════════════════════════════════" echo "" if [ $BUILD_FAILED -eq 1 ]; then echo -e "${YELLOW}⚠️ 部分平台构建失败,请检查错误信息${NC}" echo "" else echo -e "${GREEN}🎉 构建完成!${NC}" echo "" fi # 检查是否有构建产物 if ls "$OUTPUT_DIR"/mosdns-* >/dev/null 2>&1; then echo -e "${CYAN}📦 构建产物列表:${NC}" echo "" ls -1 "$OUTPUT_DIR"/mosdns-* echo "" echo -e "${CYAN}📊 文件大小详情:${NC}" for file in "$OUTPUT_DIR"/mosdns-*; do if [ -f "$file" ]; then size=$(du -h "$file" | cut -f1) filename=$(basename "$file") echo " $filename - $size" fi done echo "" else echo -e "${YELLOW}⚠️ 未找到构建产物${NC}" echo "" fi echo "════════════════════════════════════════════" echo "" echo -e "${CYAN}📝 使用方法:${NC}" echo "" echo "Linux:" echo " chmod +x $OUTPUT_DIR/mosdns-linux-amd64" echo " ./$OUTPUT_DIR/mosdns-linux-amd64 start -c config.yaml" echo "" echo "Windows:" echo " $OUTPUT_DIR\\mosdns-windows-amd64.exe start -c config.yaml" echo "" echo "macOS:" echo " chmod +x $OUTPUT_DIR/mosdns-darwin-amd64" echo " ./$OUTPUT_DIR/mosdns-darwin-amd64 start -c config.yaml" echo "" echo -e "${GREEN}🌐 Web 管理界面: http://localhost:5555${NC}" echo "" echo -e "${CYAN}💡 提示: 所有可执行文件已内嵌 Web 资源,可独立运行${NC}" echo "" } # 单平台构建 build_linux_amd64() { init_build build_platform "linux" "amd64" "mosdns-linux-amd64" "Linux AMD64" show_result } build_linux_arm64() { init_build build_platform "linux" "arm64" "mosdns-linux-arm64" "Linux ARM64" show_result } build_windows_amd64() { init_build build_platform "windows" "amd64" "mosdns-windows-amd64.exe" "Windows AMD64" show_result } build_macos_amd64() { init_build build_platform "darwin" "amd64" "mosdns-darwin-amd64" "macOS AMD64 (Intel Mac)" show_result } build_macos_arm64() { init_build build_platform "darwin" "arm64" "mosdns-darwin-arm64" "macOS ARM64 (Apple Silicon)" show_result } # 批量编译 build_all_linux() { init_build echo -e "${CYAN}[1/2]${NC}" build_platform "linux" "amd64" "mosdns-linux-amd64" "Linux AMD64" echo "" echo -e "${CYAN}[2/2]${NC}" build_platform "linux" "arm64" "mosdns-linux-arm64" "Linux ARM64" show_result } build_all_macos() { init_build echo -e "${CYAN}[1/2]${NC}" build_platform "darwin" "amd64" "mosdns-darwin-amd64" "macOS AMD64 (Intel Mac)" echo "" echo -e "${CYAN}[2/2]${NC}" build_platform "darwin" "arm64" "mosdns-darwin-arm64" "macOS ARM64 (Apple Silicon)" show_result } build_all_windows() { init_build echo -e "${CYAN}[1/1]${NC}" build_platform "windows" "amd64" "mosdns-windows-amd64.exe" "Windows AMD64" show_result } build_all() { init_build echo -e "${CYAN}[1/5]${NC}" build_platform "linux" "amd64" "mosdns-linux-amd64" "Linux AMD64" echo "" echo -e "${CYAN}[2/5]${NC}" build_platform "linux" "arm64" "mosdns-linux-arm64" "Linux ARM64" echo "" echo -e "${CYAN}[3/5]${NC}" build_platform "windows" "amd64" "mosdns-windows-amd64.exe" "Windows AMD64" echo "" echo -e "${CYAN}[4/5]${NC}" build_platform "darwin" "amd64" "mosdns-darwin-amd64" "macOS AMD64" echo "" echo -e "${CYAN}[5/5]${NC}" build_platform "darwin" "arm64" "mosdns-darwin-arm64" "macOS ARM64 (Apple Silicon)" show_result } # 主程序 main() { show_welcome check_go build_vue while true; do show_menu read -p "请输入选项 [0-8/A]: " CHOICE case "${CHOICE,,}" in 0) echo "" echo -e "${GREEN}感谢使用 MosDNS 构建工具!${NC}" echo "" exit 0 ;; 1) build_linux_amd64 ;; 2) build_linux_arm64 ;; 3) build_windows_amd64 ;; 4) build_macos_amd64 ;; 5) build_macos_arm64 ;; 6) build_all_linux ;; 7) build_all_macos ;; 8) build_all_windows ;; a) build_all ;; *) echo "" echo -e "${RED}❌ 无效的选项,请重新选择${NC}" sleep 2 continue ;; esac echo "" read -p "是否继续编译其他平台?(y/N): " CONTINUE if [[ ! "${CONTINUE,,}" =~ ^(y|yes)$ ]]; then echo "" echo -e "${GREEN}感谢使用 MosDNS 构建工具!${NC}" echo "" exit 0 fi BUILD_FAILED=0 done } # 运行主程序 main