#!/bin/bash # BearVPN macOS DMG 打包脚本 # 作者: Collins # 日期: $(date) set -e # 配置变量 APP_NAME="BearVPN" APP_VERSION="1.0.0" DMG_NAME="${APP_NAME}-${APP_VERSION}-macOS" APP_PATH="build/macos/Build/Products/Release/${APP_NAME}.app" DMG_PATH="build/macos/Build/Products/Release/${DMG_NAME}.dmg" TEMP_DMG_PATH="build/macos/Build/Products/Release/temp_${DMG_NAME}.dmg" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查应用是否存在 check_app() { log_info "检查应用文件..." if [ ! -d "$APP_PATH" ]; then log_error "应用文件不存在: $APP_PATH" log_info "请先运行: flutter build macos --release" exit 1 fi log_success "应用文件检查通过" } # 清理旧的 DMG 文件 cleanup() { log_info "清理旧的 DMG 文件..." rm -f "$DMG_PATH" "$TEMP_DMG_PATH" log_success "清理完成" } # 创建 DMG create_dmg() { log_info "开始创建 DMG 文件..." # 使用 create-dmg 创建 DMG create-dmg \ --volname "$APP_NAME" \ --volicon "macos/Runner/Assets.xcassets/AppIcon.appiconset/icon-256@2x.png" \ --window-pos 200 120 \ --window-size 600 400 \ --icon-size 100 \ --icon "$APP_NAME.app" 175 190 \ --hide-extension "$APP_NAME.app" \ --app-drop-link 425 190 \ --no-internet-enable \ "$DMG_PATH" \ "$APP_PATH" if [ $? -eq 0 ]; then log_success "DMG 文件创建成功: $DMG_PATH" else log_error "DMG 文件创建失败" exit 1 fi } # 验证 DMG verify_dmg() { log_info "验证 DMG 文件..." # 检查文件大小 DMG_SIZE=$(du -h "$DMG_PATH" | cut -f1) log_info "DMG 文件大小: $DMG_SIZE" # 检查文件类型 FILE_TYPE=$(file "$DMG_PATH") log_info "文件类型: $FILE_TYPE" # 尝试挂载 DMG 验证 log_info "验证 DMG 内容..." MOUNT_POINT=$(hdiutil attach "$DMG_PATH" -nobrowse | grep -E '^/dev/' | sed 1q | awk '{print $3}') if [ -n "$MOUNT_POINT" ]; then log_success "DMG 挂载成功: $MOUNT_POINT" # 检查应用是否在 DMG 中 if [ -d "$MOUNT_POINT/$APP_NAME.app" ]; then log_success "应用文件在 DMG 中验证成功" else log_error "应用文件在 DMG 中未找到" fi # 卸载 DMG hdiutil detach "$MOUNT_POINT" -quiet log_info "DMG 已卸载" else log_error "DMG 挂载失败" exit 1 fi } # 显示结果 show_result() { log_success "==========================================" log_success "DMG 打包完成!" log_success "==========================================" log_info "应用名称: $APP_NAME" log_info "版本: $APP_VERSION" log_info "DMG 文件: $DMG_PATH" log_info "文件大小: $(du -h "$DMG_PATH" | cut -f1)" log_success "==========================================" log_info "你可以将 DMG 文件分发给用户安装" log_info "用户双击 DMG 文件,然后将应用拖拽到 Applications 文件夹即可" } # 主函数 main() { log_info "开始 BearVPN macOS DMG 打包流程..." log_info "==========================================" check_app cleanup create_dmg verify_dmg show_result log_success "所有操作完成!" } # 运行主函数 main "$@"