379 lines
10 KiB
Bash
Executable File
379 lines
10 KiB
Bash
Executable File
#!/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
|
|
|