mosdns/build-all-platforms.sh

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