@echo off chcp 65001 >nul REM ======================================== REM MosDNS 多平台构建脚本 (带 Web UI) REM 支持: Linux, Windows, macOS (amd64/arm64) REM ======================================== echo. echo ╔════════════════════════════════════════════╗ echo ║ MosDNS 多平台构建工具 (带 Web UI) ║ echo ╚════════════════════════════════════════════╝ echo. REM 检查 Go 环境 where go >nul 2>nul if %errorlevel% neq 0 ( echo ❌ Go 未安装或不在 PATH 中 pause exit /b 1 ) echo ✅ Go 版本: go version echo. REM 检查并构建 Vue 前端 echo [检查] Vue 前端资源... if not exist "web-ui\dist\index.html" ( echo ⚠️ Vue 前端未构建,开始构建... REM 检查 Node.js where node >nul 2>nul if %errorlevel% neq 0 ( echo ❌ Node.js 未安装,无法构建 Vue 前端 echo 💡 请安装 Node.js 或手动运行: cd web-ui ^&^& npm install ^&^& npm run build pause exit /b 1 ) REM 检查 npm where npm >nul 2>nul if %errorlevel% neq 0 ( echo ❌ npm 未找到 pause exit /b 1 ) echo [1/2] 安装 Vue 依赖... cd web-ui if not exist "node_modules" ( call npm install if %errorlevel% neq 0 ( echo ❌ npm install 失败 cd .. pause exit /b 1 ) ) echo [2/2] 构建 Vue 前端... call npm run build if %errorlevel% neq 0 ( echo ❌ Vue 构建失败 cd .. pause exit /b 1 ) cd .. echo ✅ Vue 前端构建完成 ) else ( echo ✅ Vue 前端资源已存在 ) echo. REM ======================================== REM 显示平台选择菜单 REM ======================================== :MENU cls echo. echo ╔════════════════════════════════════════════╗ echo ║ MosDNS 多平台构建工具 (带 Web UI) ║ echo ╚════════════════════════════════════════════╝ echo. echo 请选择要编译的平台: echo. echo [1] Linux AMD64 (x86_64 服务器) echo [2] Linux ARM64 (树莓派、ARM 服务器) echo [3] Windows AMD64 (Windows 64位) echo [4] macOS AMD64 (Intel Mac) echo [5] macOS ARM64 (Apple Silicon M1/M2/M3) echo. echo [6] 编译所有 Linux 版本 (AMD64 + ARM64) echo [7] 编译所有 macOS 版本 (AMD64 + ARM64) echo [8] 编译所有 Windows 版本 (仅 AMD64) echo. echo [A] 编译全部平台 (推荐用于发布) echo. echo [0] 退出 echo. echo ════════════════════════════════════════════ echo. set /p CHOICE="请输入选项 [0-8/A]: " if /i "%CHOICE%"=="0" exit /b 0 if /i "%CHOICE%"=="1" goto BUILD_LINUX_AMD64 if /i "%CHOICE%"=="2" goto BUILD_LINUX_ARM64 if /i "%CHOICE%"=="3" goto BUILD_WINDOWS_AMD64 if /i "%CHOICE%"=="4" goto BUILD_MACOS_AMD64 if /i "%CHOICE%"=="5" goto BUILD_MACOS_ARM64 if /i "%CHOICE%"=="6" goto BUILD_ALL_LINUX if /i "%CHOICE%"=="7" goto BUILD_ALL_MACOS if /i "%CHOICE%"=="8" goto BUILD_ALL_WINDOWS if /i "%CHOICE%"=="A" goto BUILD_ALL if /i "%CHOICE%"=="a" goto BUILD_ALL echo. echo ❌ 无效的选项,请重新选择 timeout /t 2 >nul goto MENU REM ======================================== REM 初始化构建环境 REM ======================================== :INIT_BUILD echo. echo ════════════════════════════════════════════ echo. echo [准备] 设置构建参数... for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "BUILD_TIME=%dt:~0,4%-%dt:~4,2%-%dt:~6,2% %dt:~8,2%:%dt:~10,2%:%dt:~12,2%" set "VERSION=v5.0.0-webui" set "OUTPUT_DIR=dist" REM 创建输出目录 if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%" echo 版本: %VERSION% echo 构建时间: %BUILD_TIME% echo 输出目录: %OUTPUT_DIR%\ echo. set CGO_ENABLED=0 set "LDFLAGS=-s -w -X 'main.version=%VERSION%' -X 'main.buildTime=%BUILD_TIME%'" echo [开始] 编译中... echo. goto :EOF REM ======================================== REM 单平台编译 REM ======================================== :BUILD_LINUX_AMD64 call :INIT_BUILD echo 🔨 构建 Linux AMD64... set GOOS=linux set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-linux-amd64" . if %errorlevel% equ 0 ( echo ✅ mosdns-linux-amd64 构建成功 call :SHOW_RESULT ) else ( echo ❌ 构建失败 pause ) goto END :BUILD_LINUX_ARM64 call :INIT_BUILD echo 🔨 构建 Linux ARM64... set GOOS=linux set GOARCH=arm64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-linux-arm64" . if %errorlevel% equ 0 ( echo ✅ mosdns-linux-arm64 构建成功 call :SHOW_RESULT ) else ( echo ❌ 构建失败 pause ) goto END :BUILD_WINDOWS_AMD64 call :INIT_BUILD echo 🔨 构建 Windows AMD64... set GOOS=windows set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-windows-amd64.exe" . if %errorlevel% equ 0 ( echo ✅ mosdns-windows-amd64.exe 构建成功 call :SHOW_RESULT ) else ( echo ❌ 构建失败 pause ) goto END :BUILD_MACOS_AMD64 call :INIT_BUILD echo 🔨 构建 macOS AMD64 (Intel Mac)... set GOOS=darwin set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-darwin-amd64" . if %errorlevel% equ 0 ( echo ✅ mosdns-darwin-amd64 构建成功 call :SHOW_RESULT ) else ( echo ❌ 构建失败 pause ) goto END :BUILD_MACOS_ARM64 call :INIT_BUILD echo 🔨 构建 macOS ARM64 (Apple Silicon)... set GOOS=darwin set GOARCH=arm64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-darwin-arm64" . if %errorlevel% equ 0 ( echo ✅ mosdns-darwin-arm64 构建成功 call :SHOW_RESULT ) else ( echo ❌ 构建失败 pause ) goto END REM ======================================== REM 批量编译 REM ======================================== :BUILD_ALL_LINUX call :INIT_BUILD echo [1/2] 🔨 构建 Linux AMD64... set GOOS=linux set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-linux-amd64" . if %errorlevel% equ 0 ( echo ✅ mosdns-linux-amd64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) echo. echo [2/2] 🔨 构建 Linux ARM64... set GOOS=linux set GOARCH=arm64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-linux-arm64" . if %errorlevel% equ 0 ( echo ✅ mosdns-linux-arm64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) call :SHOW_RESULT goto END :BUILD_ALL_MACOS call :INIT_BUILD echo [1/2] 🔨 构建 macOS AMD64 (Intel Mac)... set GOOS=darwin set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-darwin-amd64" . if %errorlevel% equ 0 ( echo ✅ mosdns-darwin-amd64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) echo. echo [2/2] 🔨 构建 macOS ARM64 (Apple Silicon)... set GOOS=darwin set GOARCH=arm64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-darwin-arm64" . if %errorlevel% equ 0 ( echo ✅ mosdns-darwin-arm64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) call :SHOW_RESULT goto END :BUILD_ALL_WINDOWS call :INIT_BUILD echo [1/1] 🔨 构建 Windows AMD64... set GOOS=windows set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-windows-amd64.exe" . if %errorlevel% equ 0 ( echo ✅ mosdns-windows-amd64.exe 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) call :SHOW_RESULT goto END :BUILD_ALL call :INIT_BUILD echo [1/5] 🔨 构建 Linux AMD64... set GOOS=linux set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-linux-amd64" . if %errorlevel% equ 0 ( echo ✅ mosdns-linux-amd64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) echo. echo [2/5] 🔨 构建 Linux ARM64... set GOOS=linux set GOARCH=arm64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-linux-arm64" . if %errorlevel% equ 0 ( echo ✅ mosdns-linux-arm64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) echo. echo [3/5] 🔨 构建 Windows AMD64... set GOOS=windows set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-windows-amd64.exe" . if %errorlevel% equ 0 ( echo ✅ mosdns-windows-amd64.exe 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) echo. echo [4/5] 🔨 构建 macOS AMD64... set GOOS=darwin set GOARCH=amd64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-darwin-amd64" . if %errorlevel% equ 0 ( echo ✅ mosdns-darwin-amd64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) echo. echo [5/5] 🔨 构建 macOS ARM64 (Apple Silicon)... set GOOS=darwin set GOARCH=arm64 go build -ldflags="%LDFLAGS%" -o "%OUTPUT_DIR%\mosdns-darwin-arm64" . if %errorlevel% equ 0 ( echo ✅ mosdns-darwin-arm64 构建成功 ) else ( echo ❌ 构建失败 set "BUILD_FAILED=1" ) call :SHOW_RESULT goto END REM ======================================== REM 显示构建结果 REM ======================================== :SHOW_RESULT echo. echo ════════════════════════════════════════════ echo. if "%BUILD_FAILED%"=="1" ( echo ⚠️ 部分平台构建失败,请检查错误信息 echo. ) else ( echo 🎉 构建完成! echo. ) REM 检查是否有构建产物 if exist "%OUTPUT_DIR%\mosdns-*" ( echo 📦 构建产物列表: echo. dir /B "%OUTPUT_DIR%\mosdns-*" 2>nul echo. echo 📊 文件大小详情: for %%F in (%OUTPUT_DIR%\mosdns-*) do ( set "size=%%~zF" set /a size_mb=!size! / 1048576 echo %%~nxF - !size_mb! MB ) echo. ) else ( echo ⚠️ 未找到构建产物 echo. ) echo ════════════════════════════════════════════ echo. echo 📝 使用方法: echo. echo Windows: echo %OUTPUT_DIR%\mosdns-windows-amd64.exe start -c config.yaml echo. echo Linux: echo chmod +x %OUTPUT_DIR%/mosdns-linux-amd64 echo ./%OUTPUT_DIR%/mosdns-linux-amd64 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 🌐 Web 管理界面: http://localhost:5545 echo. echo 💡 提示: 所有可执行文件已内嵌 Web 资源,可独立运行 echo. goto :EOF REM ======================================== REM 结束 REM ======================================== :END echo. set /p CONTINUE="是否继续编译其他平台?(Y/N): " if /i "%CONTINUE%"=="Y" ( set "BUILD_FAILED=" goto MENU ) echo. echo 感谢使用 MosDNS 构建工具! echo. pause exit /b 0