Mac 打包教學:自製程式打包成 DMG 還是 APP?優劣完整分析


嗨,各位在 Mac 開發路上熱血奮鬥的夥伴!當我們熬夜寫好了一款超炫的 macOS 工具,或用 Electron、PyInstaller 搞定專案後,正準備興奮地分享給全世界時,往往會卡在最後一關:『到底該直接打包成 .APP 散佈,還是做成 .DMG 安裝檔比較專業?』今天這篇教學就要帶你深度剖析兩者的本質差異、優劣勢,並手把手教你如何用終端機與開源工具,做出大廠質感、帶有「拖拽引導介面」的精美安裝檔,讓你的軟體質感瞬間暴增!

 

 

1. 揭開面紗!.APP 與 .DMG 的本質大剖析

在開始爭論哪一個好之前,我們得先釐清一個極度重要的觀念:這兩者並不是互相排斥的竞争對手,而是「內容物」與「包裝盒」的關係!許多剛接觸 Mac 開發的朋友常會搞混,其實它們在 macOS 系統架構中扮演的角色完全不同。

首先,什麼是 .APP?在 macOS 的世界裡,雖然你在 Finder 中看到它是一個單一的應用程式圖示,但它本質上其實是一個「特殊的文件夾」(在蘋果術語中稱為 App Bundle)。如果你對著任何一個 .APP 檔案點擊滑鼠右鍵並選擇『顯示套件內容』,你就會發現裡面別有洞天!它包含了 Contents/MacOS/ 下的二進位執行檔、Resources/ 目錄下的圖示與語系檔,以及最核心的 Info.plist 設定檔。簡單來說,.APP 就是你的程式實體本身。

那麼,什麼是 .DMG 呢?它的全名是 Apple Disk Image(蘋果磁碟映像檔)。你可以把它想像成一個「虛擬光碟片」(類似 Windows 世界中的 .ISO 檔)。當使用者雙擊掛載(Mount)一個 .DMG 檔案時,系統會在桌面上虛擬出一張光碟磁碟機,裡面通常會裝著剛才提到的 .APP 檔案 以及一個指向系統「應用程式(Applications)」資料夾的捷徑。.DMG 的本質,只是一個安全、便於網路傳輸且可以高度客製化外觀的「封裝容器」。

💡 簡單的比喻:如果你的程式是一杯好喝的「珍珠奶茶」(.APP),那麼 .DMG 就是外帶時用來保護它不溢出、並且印有精美品牌 Logo 的「外包裝提袋與杯套」(.DMG)。

2. 終極 PK:.APP 與 .DMG 核心對比(一張表看懂優缺點)

為了幫助你快速理解在不同場景下該如何選擇,我們把這兩種打包模式的核心特性、安全機制與使用者體驗,整理成以下這張跨裝置相容的詳細對比表:

評比維度直接散佈 .APP (通常會壓縮成 .ZIP)打包成 .DMG (磁碟映像檔)
本質結構純應用程式資料夾 (App Bundle)唯讀的壓縮磁碟映像檔 (Disk Image)
下載體驗解壓縮後直接出現 .APP,看似簡單卻容易漏檔雙擊掛載,出現精美安裝視窗,儀式感十足
檔案完整性極易因為解壓縮軟體不同而損壞執行權限唯讀格式封裝,完美保留 Linux/macOS 權限
品牌形象普通,使用者常直接在「下載」資料夾點開執行高質感,可客製化背景圖、品牌 Logo 與拖拽引導
繞過 Translocation❌ 否。直接執行會被系統強制放入隨機沙盒路徑✅ 是。引導使用者拖入 Applications 後即正常運作
上架 App Store✅ 支援。官方審核只接受 .APP 或二進位套件❌ 不支援。App Store 不允許提交 .DMG 格式
🟢 .APP 的主要優勢

對於開發者自身測試,或是技術背景極高的內部使用者來說,.APP 最直覺、不囉唆。你編譯完成後,直接拷貝給同事,他雙擊就能立刻執行,省去了掛載與卸載磁碟的繁瑣步驟,在 CI/CD 自動化建置流程中也是最基礎的產物。

🔵 .DMG 的主要優勢

它能為非技術背景的大眾提供極致友善的「拖拽安裝」介面。同時,因為 .DMG 本身是個「唯讀的壓縮唯一個體」,可以確保你的執行檔與靜態資源在網路傳輸過程中,不會被瀏覽器或第三方解壓縮軟體惡意竄改或遺失檔案讀寫權限。

3. 避坑指南!為什麼直接散佈 .APP 會遇到致命災情?

很多開發新手會說:「既然 .APP 解壓就能用,那我直接把它壓縮成 .ZIP 放到 GitHub Release 上,不是最省事嗎?」千萬別這麼做!這會讓你踩進兩個 macOS 系統底層的超級大坑!

第一個大坑:檔案執行權限(Executable Permission)遺失。 macOS 本質上是 UNIX 系統,對於檔案權限的管理極為嚴格。當你把 .APP(資料夾)直接壓縮成 .ZIP 並上傳到網路,如果使用者使用了一些不夠標準的第三方解壓縮軟體(特別是在跨平台操作時),解壓出來的二進位執行檔很容易遺失 chmod +x 權限。使用者雙擊時只會跳出『程式已損壞』或無任何反應的錯誤,讓你每天客服信箱被塞爆!

第二個大坑:令人聞風喪膽的 App Translocation 機制。 這是蘋果為了防止「DLL 劫持」而設計的安全防禦。當使用者從瀏覽器下載一個獨立的 .APP(即使包在 .ZIP 裡),系統會為其打上 com.apple.quarantine(隔離)標籤。如果使用者解壓後,直接在「下載」資料夾中雙擊執行,macOS 會強制將這個 App 投影到一個隨機命名的唯讀沙盒路徑中(例如 /private/var/folders/.../AppTranslocation/...)執行。這會導致什麼後果?如果你的程式需要讀取同目錄下的設定檔、資料庫或外掛,它會完全找不到路徑,導致程式直接崩潰!

而 .DMG 安裝檔能完美破解這兩個問題。因為它會引導使用者執行一個「將 .APP 拖曳至 Applications(應用程式)資料夾」的動作。一旦 App 被移動到系統預設的應用程式目錄,隔離標籤就會被安全解除,App Translocation 機制隨之失效,程式便能百分之百正常讀取本機資源!

4. 實戰演練一:用 macOS 內建工具快速製作 .DMG

既然知道 .DMG 如此重要,那我們該怎麼製作它呢?首先,我們來介紹最正統、不需要安裝任何第三方軟體,直接使用 Mac 內建終端機指令的打包方式。這非常適合編寫進自動化腳本或 Shell Script 中。

macOS 提供了一個強大的磁碟映像檔管理工具叫做 hdiutil。假設你已經編譯出了一個 SuperTool.app,請將它放置在一個獨立的目錄(例如 dist/)中。打開終端機,切換到該目錄,並執行以下指令:

# 使用 hdiutil 將指定的 .app 資料夾打包成 UDZO 格式(高壓縮率的唯讀磁碟映像檔) hdiutil create -format UDZO -srcfolder ./SuperTool.app ./SuperTool.dmg

讓我們來解析一下這個指令的重要參數:

  • -format UDZO 代表採用「UDZO」格式,這是蘋果官方最推薦的分發格式。它會對內容進行高度壓縮,生成體積最小、唯讀的 .DMG 檔案。
  • -srcfolder 指定你要打包的來源路徑(即你的 .APP 所在路徑)。
  • ./SuperTool.dmg 最後一個參數則是你要輸出的 DMG 檔名與路徑。

這種方式雖然簡單、快速,但做出來的 DMG 視窗打開後,只會看到一個孤零零的 App 檔案,使用者可能還得自己手動開一個 Finder 視窗,才能把程式拖進「應用程式」裡,體驗上還是不夠完美。想要做出更高級、更具品牌質感的安裝介面嗎?請看下一節!

5. 實戰演練二:打造「大廠質感」的拖拽安裝界面!

要做出像 Google Chrome 或是 Spotify 那樣,一打開 DMG 就有精美的 Tiffany 藍背景圖、一個指向 Applications 的箭頭,並擺放好左右圖示的完美安裝視窗,手動調整會極度耗時。這裡推薦使用網路上最受歡迎的開源自動化打包神兵:create-dmg

第一步:安裝 `create-dmg`
首先,確保你的 Mac 安裝了 Homebrew 套件管理工具。打開終端機並執行:

brew install create-dmg

第二步:設計你的背景圖
使用任何修圖軟體(如 Figma、Photoshop 等),設計一張解析度為 `$720 \times 400$` 像素的 PNG 圖片(例如 installer-bg.png)。建議背景採用清爽的 Tiffany 藍色調,並在左側留出放置你的 App 圖示的位置,右側畫一個箭頭,指向系統應用程式圖示的位置。

第三步:一鍵生成超精美安裝檔
準備好你的 SuperTool.app 與背景圖,然後在終端機中執行這串魔術指令:

create-dmg \ --volname "SuperTool 安裝程式" \ --background "installer-bg.png" \ --window-pos 200 120 \ --window-size 720 400 \ --icon-size 100 \ --icon "SuperTool.app" 200 240 \ --app-drop-link 520 240 \ "SuperTool_Installer.dmg" \ "./dist_folder/"

這段指令的核心設定非常直觀,幫你詳細拆解:

  • --volname 當使用者雙擊掛載時,桌面上虛擬磁碟顯示的名稱。
  • --background 指定你剛剛設計的 `$720 \times 400$` 背景圖。
  • --window-size 限制打開時的 Finder 視窗尺寸為 `$720 \times 400$`,與背景圖完美契合。
  • --icon "SuperTool.app" 200 240 將你的 App 圖示放在視窗 X=200, Y=240 的黃金位置。
  • --app-drop-link 520 240 自動在 X=520, Y=240 的座標處,建立一個指向系統應用程式資料夾(Applications)的精美快捷捷徑。

執行完畢後,你就會得到一個質感爆棚、完全符合 macOS 系統規範的 SuperTool_Installer.dmg 囉!這絕對能讓下載你軟體的使用者,在第一眼就感受到你的專業與用心。

6. 抉擇時刻:我的專案到底適合哪一個?

看到這裡,相信你對這兩者已經有了極深的理解。最後,我們用一組簡單的場景決策樹,幫你做出最明智的打包決定:

🛠️ 場景一:內部小工具、個人開發測試,或使用者全是工程師

建議:直接輸出 .APP (或壓縮成 .ZIP)。 因為使用者本身具備終端機操作能力,且不需要精緻的介面,以最快速度迭代、分發才是首要目標。

🌐 場景二:官方網站提供下載、GitHub Release 面向大眾、商業化產品

建議:絕對要打包成 .DMG。 這不僅能解決權限損壞、App Translocation 的閃退災情,還能提供最友善的視覺導引,建立起信任感與高水準的品牌形象。

🍎 場景三:預計上架到蘋果官方的 Mac App Store

建議:必須提交 .APP 或是封裝成 .PKG。 蘋果官方商店的審核機制並不接受 .DMG 格式,上架時請遵循 Apple Configurator 與 Xcode 的導出規範。

打包完成後,也別忘了進行最關鍵的「代碼簽名(Code Signing)」與「蘋果公證(Notarization)」。唯有經過蘋果官方公證的 .DMG 或 .APP,在使用者下載安裝時才不會彈出安全警告,讓你的產品體驗真正達到完美無瑕!祝大家的專案都能大獲成功,我們下期教學見囉!

⚠️ 免責聲明:本教學所涉及之終端機指令(如 `hdiutil` 及第三方開源工具 `create-dmg`)皆會對本機檔案系統進行寫入與建立虛擬磁碟之操作。在進行任何打包與格式轉換前,請務必妥善備份你的原始程式碼與編譯完成之專案目錄。因操作不當、系統版本相容性或第三方依賴庫更新所導致之檔案遺失或編譯錯誤,本站恕不負擔任何賠償或法律責任。

留言

這個網誌中的熱門文章

讓 AI 成為你的教學「分身」,準時下班不是夢—— GEM 教學應用實戰 (Google Educator Masterclass)

2026高齡駕駛換照懶人包:70歲新制、75歲認知功能測驗、繳回駕照TPASS回饋一次看

「2026台北鼠患危機:25年首見漢他病毒!見鼠地圖與滅鼠生態反撲全解析」