Flutter MacOS应用自动化打包方案与脚本实现
1. 项目概述
Flutter作为跨平台开发框架,在桌面端领域的应用越来越广泛。但很多开发者发现,将Flutter应用打包成MacOS可分发格式(dmg)的过程相当繁琐。每次发布新版本都需要重复执行清理、编译、打包等一系列操作,不仅效率低下还容易出错。
我在实际项目中发现,通过编写自动化shell脚本可以完美解决这个问题。这个方案的核心价值在于:
- 将原本需要手动执行的7-8个步骤简化为双击脚本即可完成
- 自动读取项目版本号生成规范化的dmg文件名
- 标准化打包流程,避免人为操作失误
- 特别适合需要频繁打包测试的CI/CD场景
2. 环境准备与工具配置
2.1 基础环境要求
在开始之前,请确保开发环境满足以下条件:
- 已安装Flutter SDK且配置了桌面端开发环境(flutter doctor通过所有检查)
- MacOS系统版本≥10.15(Catalina)
- 已安装Homebrew包管理器
- 项目已配置好MacOS构建支持(flutter create --platforms=macos)
提示:如果遇到"could not find a flutter sdk"错误,请检查flutter命令是否已加入PATH环境变量
2.2 create-dmg安装与验证
这个方案的核心依赖是create-dmg工具,它负责将.app文件转换为dmg镜像。安装方法很简单:
brew install create-dmg安装完成后建议运行以下命令验证:
create-dmg --version # 预期输出类似:create-dmg version 1.0.03. 脚本实现详解
3.1 脚本文件结构
完整的打包方案包含以下文件:
project_root/ ├── packages/ │ ├── generate_mac_dmg (主脚本) │ └── installer_background.png (dmg背景图) ├── pubspec.yaml └── ... (其他项目文件)3.2 主脚本解析
脚本的核心逻辑分为四个阶段:
#!/bin/sh # 阶段1:初始化环境 cd "$( dirname "$0" )" cd ../ # 阶段2:清理并构建项目 flutter clean flutter build macos --release # 阶段3:解析版本信息 fullVersion=$(grep -i "version: " pubspec.yaml) buildName=$(echo $fullVersion | cut -d " " -f 2 | cut -d "+" -f 1) buildNumber=$(echo $fullVersion | cut -d "+" -f 2 ) # 阶段4:生成dmg文件 create-dmg \ --volname "${appName}安装器" \ --background "../installer_background.png" \ --window-pos 200 120 \ --window-size 800 450 \ --icon-size 100 \ --icon "${appName}.app" 240 190 \ --hide-extension "${appName}.app" \ --app-drop-link 550 190 \ "./$fileName" \ "../../build/macos/Build/Products/Release"3.3 关键参数说明
| 参数 | 作用 | 推荐值 |
|---|---|---|
| --volname | dmg挂载时显示的卷名 | 应用名+安装器后缀 |
| --window-size | dmg窗口尺寸 | 800×450(适配Retina) |
| --icon-size | 应用图标大小 | 100px |
| --app-drop-link | Applications快捷方式位置 | 右侧居中区域 |
4. 实战操作指南
4.1 首次使用配置
- 在项目根目录创建packages文件夹
- 将脚本文件放入并赋予执行权限:
chmod +x generate_mac_dmg- 准备一张800×450像素的背景图(建议使用纯色渐变背景)
4.2 打包执行流程
- 双击运行generate_mac_dmg
- 脚本会自动:
- 清理旧构建产物
- 编译Release版本
- 生成带版本号的dmg文件
- 打开输出目录
- 输出文件路径:packages/products/应用名_macos_版本号.dmg
4.3 自定义配置项
在脚本开头可以修改这些变量:
# 自定义dmg文件名前缀 fileNamePrefix="MyApp" # 指定.app文件名(默认自动检测) appName="custom_name.app" # 修改dmg窗口尺寸 windowWidth=900 windowHeight=5005. 常见问题排查
5.1 打包失败常见原因
| 错误现象 | 解决方案 |
|---|---|
| create-dmg命令未找到 | 检查brew安装是否成功,重新执行brew link create-dmg |
| 背景图加载失败 | 确认图片路径正确,建议使用绝对路径 |
| 版本号解析错误 | 检查pubspec.yaml中version格式是否为x.x.x+x |
| .app文件找不到 | 确认flutter build macos执行成功 |
5.2 性能优化建议
- 在CI环境中可以添加--no-clean参数避免重复清理:
flutter build macos --release --no-clean- 对于大型项目,可以增加编译缓存:
flutter pub get && flutter precache --macos6. 进阶应用场景
6.1 与CI/CD集成
在GitHub Actions中配置自动打包:
jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v2 - run: brew install create-dmg - run: chmod +x packages/generate_mac_dmg - run: ./packages/generate_mac_dmg - uses: actions/upload-artifact@v2 with: name: MacOS-Package path: packages/products/*.dmg6.2 多架构支持
针对Apple Silicon优化:
flutter build macos --release --target-platform darwin-arm64,darwin-x64在create-dmg命令前添加架构检测:
arch=$(uname -m) if [ "$arch" = "arm64" ]; then export PATH="/opt/homebrew/bin:$PATH" fi这个方案经过多个实际项目验证,平均将打包时间从原来的15分钟缩短到3分钟以内,且完全消除了人为操作失误的风险。特别是在需要频繁打包的敏捷开发场景中,效率提升更为明显。
