admin 管理员组文章数量: 1184232
1. 为什么你需要一个.dmg文件?不仅仅是分发
如果你是macOS的开发者,或者你经常需要把一些自己写的工具、脚本打包分享给朋友或同事,那你肯定遇到过这个问题:怎么把东西发给别人,才能让对方觉得“嗯,这很Mac”?直接扔一个
.app
文件夹过去?对方大概率会一脸懵,不知道这是个啥,甚至可能因为Gatekeeper安全机制而无法直接运行。压缩成
.zip
?解压后文件散落在桌面上,安装步骤还得靠你口述,体验太差了。
这时候,
.dmg
(Disk Image)文件就该登场了。它远不止是一个压缩包那么简单。你可以把它理解为一个
虚拟的、只读的U盘镜像
。用户双击它,macOS会把它“挂载”成一个虚拟磁盘,就像插上了一个U盘一样。在这个虚拟磁盘里,你可以精心布置一个安装界面:左边放你的应用,右边放一个指向“应用程序”文件夹的快捷方式(替身),再配上漂亮的背景图。用户要做的,就是把应用图标拖到“应用程序”文件夹里,安装就完成了。整个过程直观、优雅,完全符合Mac用户的操作直觉,体验和专业软件分发一模一样。
我刚开始做独立开发的时候,就是靠
.dmg
来分发早期测试版的。绕过App Store审核,快速迭代,收集用户反馈,非常灵活。而且,
.dmg
文件本身可以压缩,体积小,传输方便。更重要的是,它给人一种“正式软件”的感觉,用户信任度会高很多。所以,无论你是为了内部测试、小范围分发,还是最终的产品发布,掌握
.dmg
制作都是一项必备技能。网上虽然有DropDMG这样的图形化工具,但我一直坚持用系统自带的方法,原因很简单:
可控、透明、免费,而且能让你真正理解背后的原理
,哪天你需要写自动化脚本时,就知道命令该怎么写了。
2. 打包前的准备工作:把“舞台”搭好
制作
.dmg
就像准备一场演出,你得先把后台和道具都安排妥当。这一步做得好,后面就顺风顺水。
首先,也是最核心的,是你的
.app
文件。
确保它是在Release模式下编译的,已经签名(即使只是用开发者ID进行临时签名,对于分发也至关重要,能避免很多安全警告),并且在你自己的机器上测试运行无误。一个常见的坑是,你的应用可能依赖一些动态库或资源文件,在Xcode里运行正常,但单独把
.app
拖出来就崩溃了。这时候你需要检查
.app
包内容(右键显示包内容),看看
Frameworks
或
Resources
目录下是否包含了所有必要的东西。我吃过亏,曾经有个应用因为漏了一个小的图标资源文件,在别人的机器上就显示异常。
其次,创建一个干净的“舞台”文件夹。
我强烈建议在桌面上新建一个文件夹,名字可以清晰一点,比如
MyApp_For_DMG
。把所有要放进
.dmg
的东西都放在这里。为什么要在桌面?因为路径简单,不容易出错,后续在终端里操作也方便。这个文件夹的最终内容,基本上就是用户打开
.dmg
后看到的全部内容。通常,我们会放三样东西进去:
-
你的
MyApp.app。 -
一个指向
/Applications(应用程序文件夹)的替身(Alias),我们叫它Applications。 -
(可选)一张漂亮的背景图片,比如一个
.png文件,用来美化dmg窗口。
关于
替身
,这里多说两句。它的作用就是给用户一个明确的拖放目标。在Mac上,把应用安装到“应用程序”文件夹是标准做法。所以我们需要在
dmg
里创建一个“应用程序”文件夹的快捷方式。注意,是创建替身,而不是真的把整个
/Applications
文件夹复制进来。创建替身有两种主流方法,我接下来会详细讲。
3. 创建“应用程序”替身:终端与图形化双路径
这是搭建舞台的关键一步。我们要在刚才准备好的文件夹里,创建一个指向系统真正“应用程序”文件夹的快捷方式。
3.1 终端命令法:精准高效,适合自动化
这是我个人最推荐,也是开发者最应该掌握的方法。打开“终端”(Terminal),我们一步步来。
首先,用
cd
命令导航到你准备好的文件夹。假设你的文件夹在桌面,名叫
MyApp_For_DMG
,你的用户名是
xiaoming
,那么命令就是:
cd /Users/xiaoming/Desktop/MyApp_For_DMG
成功进入后,终端提示符的路径会改变。接下来,使用
ln -s
命令创建符号链接(可以理解为一种更底层的“替身”):
ln -s /Applications/ Applications
让我拆解一下这个命令:
ln是创建链接的命令。-s参数代表创建“符号链接”(symbolic link)。/Applications/是目标,即系统自带的应用程序文件夹。注意后面的斜杠/不是必须的,但加上更规范。Applications是链接的名字,也就是将在你当前文件夹里创建出来的文件。
执行后,你会发现
MyApp_For_DMG
文件夹里多了一个名为
Applications
的文件,图标上有个小箭头,这就是我们需要的替身。它的本质是一个指向真实
/Applications
文件夹的指针。用终端方法的好处是
绝对精确
,不会出错,而且这个命令可以直接写进Shell脚本里,实现全自动打包,这在持续集成(CI/CD)流程中非常有用。
3.2 图形界面法:直观易懂,随手可用
如果你不熟悉终端,或者只是偶尔做一次,图形化方法更友好。这个方法被我戏称为“黄金右手”操作,因为全靠鼠标。
- 打开“访达”(Finder),在边栏找到并点击进入“应用程序”文件夹。
- 在“应用程序”文件夹的空白处,或者直接选中“应用程序”文件夹本身, 右键点击 。
- 在弹出的菜单里,选择“制作替身”。这时,你会看到文件夹里出现了一个名为“应用程序替身”的新文件。
-
把这个“应用程序替身”文件,
拖拽
到你之前准备好的
MyApp_For_DMG文件夹里。 -
为了更美观和符合惯例,你可以在文件夹里把它重命名为简单的
Applications。
两种方法最终效果几乎一样。终端方法生成的符号链接在技术上更底层、更通用;图形方法生成的替身(Alias)是Mac特有的格式,兼容性极好。对于制作
dmg
这个场景,两者都可以完美工作。你可以根据喜好选择。
4. 核心操作:使用“磁盘工具”生成.dmg文件
舞台搭好,演员(.app)和道具(替身)就位,现在可以正式“录制”我们的虚拟U盘——
.dmg
文件了。macOS自带的“磁盘工具”就是我们的导演。
打开磁盘工具 :你可以通过Spotlight搜索(Command+空格,输入“磁盘工具”)快速找到并打开它。
创建新映像 :在磁盘工具的菜单栏,点击“文件” -> “新建映像” -> “来自文件夹的映像...”。快捷键是
Command+Shift+N。这个操作的意思是,我们不是创建一个空白的磁盘映像,而是直接用一个现有的文件夹作为内容来创建。选择源文件夹 :在弹出的文件选择窗口中,找到并选中我们精心准备的
MyApp_For_DMG文件夹,点击“打开”。设置映像参数 :这时会弹出一个设置窗口,这里有几个关键选项需要你理解:
-
存储为
:这是你最终生成的
.dmg文件的文件名,比如MyApp_v1.0.dmg。 -
位置
:选择
.dmg文件保存到哪里,桌面就很方便。 -
加密
:如果你的应用涉及敏感数据,可以选择加密(128位或256位AES加密),这样用户打开
dmg时需要输入密码。对于普通分发,选“无”即可。 -
映像格式
:
这是最重要的选项!
-
压缩
:默认选项。生成的
.dmg文件体积最小,非常适合网络传输。但它是只读的,用户无法修改其中的内容。 -
读/写
:生成的
dmg可以像普通磁盘一样被挂载、修改、保存。适合作为中间工作文件,但最终分发时一般不选这个。 - DVD/CD主映像 :用于刻录光盘,很少用。
- 混合映像 :更高级的格式,兼容性最好。对于绝大多数应用分发场景, 选择“压缩”就完全足够了 。它完美实现了我们“只读、小巧、易传输”的目标。
-
压缩
:默认选项。生成的
-
存储为
:这是你最终生成的
点击“存储” :磁盘工具会开始工作,进度条走完,一个新鲜的
.dmg文件就出现在你指定的位置了。
到这一步,一个功能完整的
.dmg
已经制作成功了。你可以双击它试试,系统会把它挂载为一个新的磁盘,打开后就能看到你的
.app
和
Applications
替身。用户只需要拖拽一下就能安装。但是,这样的
dmg
界面还比较朴素,就是一个普通的Finder窗口。如果你想让它看起来更专业、更友好,我们还需要进行“美化”。
5. 进阶美化:打造专业级的安装器界面
一个原生的
dmg
窗口可能大小不合适,背景是默认的白色,图标排列也可能不整齐。我们可以通过一些技巧来定制它,让用户体验提升一个档次。这里需要用到一些终端命令,但别怕,跟着做很简单。
核心思路是:我们先创建一个
可读写的
dmg
,在里面进行窗口视图的定制(调整图标大小、位置、背景图等),然后将这些视图设置保存下来,最后再
转换为压缩格式
的
dmg
。
第一步:创建可读写的DMG
在磁盘工具创建映像时,映像格式选择“读/写”,命名为
MyApp_Temp.dmg
。创建完成后,系统会自动挂载它。打开这个磁盘,你应该能看到里面的
.app
和替身。
第二步:调整窗口视图
-
进入这个磁盘,按
Command+J(或者菜单栏选择“显示”->“显示视图选项”)。 - 在弹出的面板里,你可以设置图标大小、网格间距、文字大小等。建议把图标调大一些,比如80x80,看起来更清晰。
-
设置背景图
:这是美化的关键。在视图选项面板底部,有一个“背景”选项,选择“图片”,然后把你准备好的背景图(比如一个带有箭头指示或产品Logo的
.png文件)拖进去。背景图建议尺寸和磁盘窗口大小匹配,可以先调整好窗口大小再设置。 -
排列图标
:手动把
.app和Applications替身拖到你想要的位置,通常是一个在左,一个在右,背景图上可以画个箭头从.app指向Applications,引导用户操作。 -
关闭窗口。Finder会自动记住这个窗口的视图设置(包括图标位置、背景、大小等),这些信息被存储在一个名为
.DS_Store的隐藏文件里。
第三步:转换为压缩格式并隐藏无关内容
现在,这个可读写的
dmg
里有了我们定制的视图,但也多了一个
.DS_Store
文件(我们需要的)和可能存在的
.Trashes
等文件(我们不需要的)。
-
在终端中,使用
hdiutil命令进行转换和压缩:
这个命令的意思是:将hdiutil convert MyApp_Temp.dmg -format UDZO -ov -imagekey zlib-level=9 -o MyApp_Final.dmgMyApp_Temp.dmg转换为UDZO格式(即压缩格式),-ov表示覆盖输出文件,-imagekey zlib-level=9指定最高压缩级别,输出为MyApp_Final.dmg。 -
转换完成后,
MyApp_Final.dmg就是我们最终想要的、带有定制视图的压缩镜像了。你可以把中间的MyApp_Temp.dmg删除。
经过美化后的
dmg
,打开后窗口大小合适,背景美观,图标排列整齐,用户一眼就知道该怎么操作,体验堪比专业商业软件。
6. 自动化脚本:一键完成所有工作
如果你需要频繁打包,或者想把打包集成到Xcode的构建后脚本(Post-action script)里,手动操作就太累了。我们可以把上面的步骤写成一个Shell脚本,实现一键打包。
下面是一个功能比较完善的示例脚本,你可以保存为
create_dmg.sh
,然后通过终端
bash create_dmg.sh
来运行。
#!/bin/bash
# 定义变量
APP_NAME="YourAppName" # 你的应用名
APP_PATH="/path/to/YourApp.app" # 你的.app完整路径
DMG_NAME="${APP_NAME}_Installer"
TEMP_DIR="./${DMG_NAME}_Temp"
FINAL_DMG_NAME="${DMG_NAME}.dmg"
BACKGROUND_PIC="./background.png" # 可选背景图路径
# 1. 清理并创建临时目录
echo “正在创建临时工作目录...”
rm -rf "${TEMP_DIR}"
mkdir -p "${TEMP_DIR}"
# 2. 复制.app文件到临时目录
echo “正在复制应用文件...”
cp -R "${APP_PATH}" "${TEMP_DIR}/"
# 3. 创建Applications替身(使用符号链接)
echo “正在创建应用程序替身...”
ln -s /Applications "${TEMP_DIR}/Applications"
# 4. (可选)复制背景图
if [ -f "${BACKGROUND_PIC}" ]; then
cp "${BACKGROUND_PIC}" "${TEMP_DIR}/.background.png"
fi
# 5. 计算文件夹大小,用于确定DMG初始尺寸(增加约50MB余量)
FOLDER_SIZE=$(du -sm "${TEMP_DIR}" | cut -f1)
DMG_SIZE=$((FOLDER_SIZE + 50))
# 6. 创建可读写的DMG
echo “正在创建可读写磁盘映像...”
hdiutil create -srcfolder "${TEMP_DIR}" -volname "${DMG_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${DMG_SIZE}m "${DMG_NAME}_temp.dmg"
# 7. 挂载这个DMG
echo “正在挂载磁盘映像...”
MOUNT_RESULT=$(hdiutil attach -nobrowse -readwrite -noverify -noautoopen "${DMG_NAME}_temp.dmg" | grep Apple_HFS)
DEVICE_NAME=$(echo $MOUNT_RESULT | awk '{print $1}')
MOUNT_PATH=$(echo $MOUNT_RESULT | awk '{print $3}')
# 8. (可选)使用AppleScript设置窗口视图、背景、图标位置
# 这部分脚本较长,用于自动化窗口美化,可以根据需要调整
echo “正在设置安装器窗口样式...”
echo '
tell application "Finder"
tell disk "'${DMG_NAME}'"
open
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 100, 900, 465}
set viewOptions to the icon view options of container window
set arrangement of viewOptions to not arranged
set icon size of viewOptions to 80
set background picture of viewOptions to file ".background.png"
set position of item "'${APP_NAME}'.app" of container window to {120, 180}
set position of item "Applications" of container window to {380, 180}
close
open
update without registering applications
delay 2
end tell
end tell
' | osascript
# 9. 设置文件权限,并卸载(弹出)磁盘
echo “正在设置权限并卸载...”
chmod -Rf go-w "${MOUNT_PATH}"
sync
hdiutil detach "${DEVICE_NAME}"
# 10. 将可读写DMG转换为压缩的只读DMG(最终成品)
echo “正在生成最终压缩镜像...”
hdiutil convert "${DMG_NAME}_temp.dmg" -format UDZO -ov -imagekey zlib-level=9 -o "${FINAL_DMG_NAME}"
# 11. 清理临时文件
echo “正在清理临时文件...”
rm -rf "${TEMP_DIR}"
rm -f "${DMG_NAME}_temp.dmg"
echo “搞定!安装镜像已生成:${FINAL_DMG_NAME}”
这个脚本看起来长,但逻辑很清晰:准备文件 -> 创建临时dmg -> 挂载并美化 -> 压缩为最终dmg -> 清理。你可以把它放到你的项目根目录,每次编译完Release版本后运行一下,就能自动生成一个专业的安装镜像,大大提升了效率。
7. 测试与分发:最后一步的注意事项
生成
.dmg
文件后,千万别急着发出去。一定要进行彻底的测试,最好是在一台
干净的、没有开发环境的Mac
上进行,模拟真实用户的场景。
-
完整安装测试
:双击
dmg文件,将其挂载。然后按照你设计的流程,把.app拖到Applications替身上。检查应用是否被正确复制到了系统的“应用程序”文件夹里。 -
运行测试
:从“应用程序”文件夹或启动台启动刚安装的应用。检查功能是否正常,有没有崩溃,特别是涉及文件读写、网络请求等权限的地方。因为从
dmg安装和从Xcode直接运行,应用的沙盒路径可能会有所不同。 -
安全性与公证
:对于要公开分发的应用,强烈建议进行
公证
。你需要一个苹果开发者账号,使用
xcrun notarytool命令行工具或Xcode的归档分发功能,将你的.app提交给苹果进行安全扫描。公证通过后,用户在首次打开时就不会看到“无法验证开发者”的警告了。这是一个提升用户信任度的关键步骤。注意,公证的是.app文件本身,而不是.dmg。你可以在打包dmg之前先对.app进行公证。 -
版本与命名
:在
dmg的文件名中清晰地包含应用名称和版本号,例如MyApp_v2.1.0.dmg。这有助于你和用户管理不同版本。 -
分发渠道
:你可以通过邮件、网盘、你自己的网站等方式分发这个
.dmg文件。如果用户量不大,这些方式足够了。如果用户量增长,可以考虑使用像Sparkle这样的开源框架来为你的Mac应用增加自动更新功能,那时dmg就作为初次安装的载体。
我自己就踩过坑,早期有一次没在干净环境测试,直接发给测试者,结果对方因为系统版本稍低,一个动态库链接失败导致应用闪退。所以,
模拟真实用户环境测试
这一步绝对不能省。当你看到用户毫无障碍地打开
dmg
、拖拽安装、顺利启动应用时,那种成就感,和通过App Store审核有得一拼。这套流程掌握后,你就完全掌握了macOS应用分发的主动权。
版权声明:本文标题:Mac操作系统打包小技巧:轻松生成.dmg文件,让你的软件分发更便捷 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1773340610a3560830.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论