我需要为 Mac 应用程序创建一个不错的安装程序。我希望它是具有预定义大小、布局和背景图像的磁盘映像 (DMG)。
我需要在脚本中以编程方式执行此操作,以便集成到现有的构建系统中(实际上更多的是一个包系统,因为它只创建安装程序。构建是单独完成的)。
我已经使用“hdiutil”完成了 DMG 创建,但我还没有发现如何制作图标布局和指定背景位图。
经过大量研究,我想出了这个答案,特此将其放在这里作为我自己问题的答案,以供参考:
确保在系统偏好设置>>通用访问中选中“启用辅助设备访问”。AppleScript 需要它才能工作。在此更改后您可能需要重新启动(否则它在 Mac OS X Server 10.4 上不起作用)。
创建一个 R/W DMG。它必须大于结果。在此示例中,bash 变量“size”包含以 Kb 为单位的大小,并且“source”bash 变量中的文件夹内容将被复制到 DMG 中:
hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${size}k pack.temp.dmg
挂载磁盘映像,并存储设备名称(您可能希望在此操作后使用 sleep 几秒钟):
device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \ egrep '^/dev/' | sed 1q | awk '{print $1}')
将背景图片(PNG 格式)存储在 DMG 中名为“.background”的文件夹中,并将其名称存储在“backgroundPictureName”变量中。
使用 AppleScript 设置视觉样式(.app 的名称必须在 bash 变量“applicationName”中,根据需要使用其他属性的变量):
echo '
tell application “Finder” tell disk “’${title}’“ 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, 885, 430} set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 72 set background picture of theViewOptions to file “.background:’${backgroundPictureName}’“ make new alias file at container window to POSIX file “/Applications” with properties {name:”Applications”} set position of item “’${applicationName}’” of container window to {100, 100} set position of item “Applications” of container window to {375, 100} update without registering applications delay 5 close end tell end tell ‘ | osascript
通过正确设置权限、压缩和释放它来完成 DMG:
chmod -Rf go-w /Volumes/"${title}"
sync sync hdiutil detach ${device} hdiutil convert “/pack.temp.dmg” -format UDZO -imagekey zlib-level=9 -o “${finalDMGName}” rm -f /pack.temp.dmg
在 Snow Leopard 上,上面的 applescript 不会正确设置图标位置 - 这似乎是一个 Snow Leopard 错误。一种解决方法是在设置图标后简单地调用关闭/打开,即:
.. set position of item "'${applicationName}'" of container window to {100, 100} set position of item "Applications" of container window to {375, 100} close open