DMG 是 macOS 專用磁碟映像格式。在 Linux 上可透過 hdiutil (需 macOS 環境) 或跨平台工具建立,本文提供一套完整 Shell 腳本:自動讀取 Info.plist 版本號、計算暫存目錄大小、建立可讀寫暫存 DMG、掛載後自訂背景圖示/視窗大小、最終轉換為唯讀壓縮 DMG 釋出。

dmg2img、7z 解壓;建立需 macOS hdiutilTransMac、PowerISO 開啟/燒錄build_dmg.sh#!/bin/bash
set -euo pipefail
APP_NAME="Soulver"
VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${APP_NAME}.app/Contents/Info.plist")
DMG_BACKGROUND_IMG="Background.png"
VOL_NAME="${APP_NAME} ${VERSION}"
DMG_TMP="${VOL_NAME}-temp.dmg"
DMG_FINAL="${VOL_NAME}.dmg"
STAGING_DIR="./Install"
# 清理舊檔
rm -rf "${STAGING_DIR}" "${DMG_TMP}" "${DMG_FINAL}"
# 建立暫存目錄並複製 App
mkdir -p "${STAGING_DIR}"
cp -Rp "${APP_NAME}.app" "${STAGING_DIR}/"
# 計算所需大小 (MB) + 1MB 餘量
SIZE=$(du -sm "${STAGING_DIR}" | awk '{print $1}')
SIZE=$(echo "${SIZE} + 1" | bc | awk '{print int($1+0.5)}')
[ $? -ne 0 ] && { echo "Error: Cannot compute size"; exit 1; }
# 建立暫存可讀寫 DMG (HFS+)
hdiutil create -srcfolder "${STAGING_DIR}" \
-volname "${VOL_NAME}" -fs HFS+ \
-fsargs "-c c=64,a=16,e=16" \
-format UDRW -size ${SIZE}M "${DMG_TMP}"
echo "Created DMG: ${DMG_TMP}"
# 掛載暫存 DMG 進行視窗美化
DEVICE=$(hdiutil attach -readwrite -noverify "${DMG_TMP}" | egrep '^/dev/' | head -1 | awk '{print $1}')
sleep 2
# 此處可加入 osascript 設定 Finder 視窗大小、背景圖、圖示位置
# 範例略過,參考 AppleScript 文件
# 卸載並轉換為最終壓縮唯讀 DMG
hdiutil detach "${DEVICE}"
hdiutil convert "${DMG_TMP}" -format UDZO -o "${DMG_FINAL}"
rm -f "${DMG_TMP}"
echo "Final DMG: ${DMG_FINAL}"
| 指令 | 用途 |
|---|---|
PlistBuddy | 讀取/修改 macOS plist 設定檔 (版本號、Bundle ID 等) |
hdiutil create | 建立映像檔:-format UDRW 可讀寫、-fs HFS+ 檔案系統 |
hdiutil attach | 掛載映像檔,回傳裝置路徑 (如 /dev/disk2) |
hdiutil convert | 格式轉換:UDZO 壓縮唯讀、UDBZ bzip2 壓縮、ULFO lzfse |
hdiutil detach | 卸載映像檔 |
純 Linux 環境建議使用 genisoimage/mkisofs 產出 ISO,或 tar.gz/zip 釋出;macOS 專屬發布才需 DMG。