AppPorts:把 Xcode、Steam 搬到外接 SSD 的開源 Mac 遷移工具

AppPorts 是 wzh4869/AppPorts 採 Apache-2.0 授權的 macOS App 遷移工具,用原生 Swift 開發,能把 Xcode、Steam 庫、Final Cut 素材這類體積大的 App 搬到外接 SSD,並在原位留下無箭頭的 Stub Portal 啟動器。本文依官方

用 AI 摘要這篇文章:

256GB 的 Mac 用不到半年就會出現一種尷尬:Xcode 一裝 40GB、Steam 上的《柏德之門 3》破百GB、Logic Pro 音色庫像無底洞,然後系統列就開始每天跳「磁碟空間即將用盡」。蘋果原廠把儲存顆粒賣得像摻了金粉,要價不斐,多數人當年為了省錢挑了最低容量,事後後悔也來不及。直覺做法是把 App 拖到外接 SSD,但 macOS 的系統機制不允許你這樣硬幹:Launchpad 圖示會消失、Spotlight 索引失效,Adobe 或 Xcode 這類對路徑敏感的開發工具還會因為路徑變更直接崩潰。本文要介紹的 AppPorts,就是專門用來處理這個尷尬的開源 Mac 工具。

先把身份與授權講清楚。AppPorts 的 GitHub repo 是 wzh4869/AppPorts,以 Apache-2.0 授權開源(ahhhhhfs 原文未提及授權,本文以 repo LICENSE 檔為準),用 Swift 與 SwiftUI 原生開發,作者 wzh4869 同時維護官方網站 appports.shimoko.com 與文件站 docs-appports.shimoko.com。截至 2026-07-22,repo 累計 1925 顆星、79 個 fork、3 個未解 issue,最近一次發版是 v1.8.0(2026-07-07),兩週前還在交付新功能,屬於積極維護中的專案,不是那種放著不動的明星倉庫。

AppPorts 的 GitHub 專案頁 wzh4869/AppPorts,顯示 Apache-2.0 授權、Swift 語言標籤與 1925 starsPin
wzh4869/AppPorts GitHub 專案頁。截至 2026-07-22 累計 1925★、79 forks,Apache-2.0 授權。(圖片來源:AppPorts GitHub)

核心機制:Stub Portal 假殼留在原位

ahhhhhfs 原文把 AppPorts 的核心機制描述為「把 App 內部最占空間的 Contents 資料目錄搬到外接硬碟,再建立軟連結(symlink)」,這段說明 在 v1.6.1(2026-05-11)之後已經不再是主要機制。依 repo README 與 v1.6.1 Release Notes,AppPorts 目前預設採用作者稱為「Stub Portal」的做法:把真實 App 完整搬到外接儲存,原本 /Applications 位置只留一顆原生 Mach-O 啟動器(stub),負責把使用者點擊轉發到外接硬碟上的真 App。

這顆 stub 跟傳統 symlink 有幾個關鍵差異。Finder 圖示上不會出現快捷方式小箭頭,Launchpad 與 macOS 26 的 App Menu 都能正常使用,對使用者來說「App 看起來還裝在本機」。之所以要這樣設計,是因為 symlink 對自更新 App(Sparkle、Electron、Chrome 系)特別脆弱:更新器會把外接硬碟上的 App 覆寫或刪掉, linkage 一斷整個 App 就報壞。Stub Portal 多了一層「鎖定模式(Lock Mode)」可以把外接硬碟上的真 App 用 uchg 旗標鎖住,避免自更新機制誤殺。

AppPorts 主介面截圖,顯示本機應用清單與外接硬碟遷移選項Pin
AppPorts 主介面,可看到本機 App 清單與遷移到外接儲存的選項。(圖片來源:AppPorts 官方 README)
功能AppPorts(Stub Portal)傳統 symlink
Finder 圖示原生無箭頭有箭頭覆蓋
Launchpad正常不穩定
macOS 26 App Menu正常不支援
自更新保護Lock Mode
簽章管理內建
孤兒連結偵測自動紅色標記
資料來源:AppPorts repo README(截至 2026-07-22,v1.8.0)。

八種 App 各自對應不同遷移策略

AppPorts 並不是把所有 App 一視同仁地搬,它依 App 類型套用不同策略。這份策略表是讀 README 整理出來的,因為這部分直接決定你哪些 App 可以搬、哪些搬了會出事:

App 類型策略預設
原生 Mac AppStub Portal啟用
自更新 App(Sparkle、Electron、Chrome 系)Stub Portal + 鎖定啟用
iPhone/iPad AppiOS Stub Portal啟用
Mac App Store App(macOS 15.1+)原生直裝外接15.1+ 自動
套裝 App(Office、Adobe)整個資料夾 symlink啟用
系統內建 App封鎖禁止遷移
執行中 App封鎖須先結束
已連結 App封鎖避免雙重連結
資料來源:AppPorts repo README「Migration Strategy」章節(v1.8.0)。

從這張表可以看出兩件讀者最常問的事:系統內建 App(Safari、系統設定等)AppPorts 會直接擋下來不給搬,避免你搞崩系統;執行中的 App 會被擋下來要求你先關掉。這兩個封鎖是有意的設計,不是 bug。另外 套裝 App(Office、Adobe)走的是傳統 symlink,這是因為這類 App 的容器結構特殊,單一 stub 應付不來。

真實 compatibility 地雷:WeChat、Adobe、飛書都有災情

本文不會把 AppPorts 寫成「裝了就沒事」。GitHub Issues 上確實有真實災情值得你動手前先看一眼:Issue #44(2026-05-25)回報微信資料目錄遷移後,打開時會跳「目錄無法識別」、訊息看起來像遺失,這個 issue 下累積 12 則討論,作者在 v1.7.0 加入「資料遷移重簽章確認」流程(會問你是否要一併 Ad-hoc 重簽)來降低這類風險;Issue #51(2026-06-22)則回報 Adobe、Apple Office、飛書不同程度都有問題;Issue #42(2026-05-19)是 Office 類 App 遷移後,雙擊本機文件會啟動 App 但讀不到該文件,這個 bug 已在 v1.6.2 換成原生 Mach-O stub 後修復。

換句話說,AppPorts 能幫你把 Xcode、Steam 庫這類「對路徑沒那麼敏感、檔案又大」的工具往外丟,但是牽涉到容器資料、綁定簽章、內部通訊錄或訊息庫的 App(微信、Adobe、飛書、Office),資料目錄遷移就是有實際風險的動作,作者自己也用 UI 警告與重簽章流程承認這點。如果你要搬的是這類 App,建議先用 Time Machine 完整備份再動工,不要第一次就拿工作用的微信帳號當白老鼠。

Sparkle、Electron 與 Chrome 系:為什麼自更新 App 需要 Lock Mode

AppPorts 的策略表把 Sparkle、Electron、Chrome 系自更新 App 獨立歸成一類,並預設啟用「Stub Portal + 鎖定」而非單純 Stub Portal,這個設計對應的是一個很具體的故障模式。Sparkle 是 macOS 生態最常見的 App 自動更新框架,Electron 系 App(VS Code、Slack、Discord)內建自己的 updater,Chrome 與 Chromium 系瀏覽器則有 Google 更新服務。這些更新器共通的行為是:偵測到新版本時,會下載更新包並嘗試原地覆寫現有 App 容器,外接硬碟上的真 App 一旦被覆寫,原本的目錄結構與 stub 啟動器之間的對應就會斷裂,輕則 App 無法啟動,重則出現「半新半舊」的混合狀態。

AppPorts 對應的方式是在遷移完成後對外接硬碟上的真 App 設定 uchg(user immutable)旗標,這是 BSD 層級的檔案鎖定機制,會讓一般的 rmmv 與多數 updater 的寫入動作直接失敗。當 Sparkle 或 Electron updater 嘗試覆寫時,作業系統會拒絕寫入,updater 通常會跳出權限錯誤提示,使用者這時可以回到 AppPorts 解除鎖定、讓更新跑完,再重新鎖定。這個流程比傳統 symlink 保護得多一層,但代價是你必須在 App 更新時主動介入:你不會再被自動更新,而是被通知「這個 App 鎖定了,請先解鎖」。對重度使用者這是合理 trade-off,對「裝了就不管」的使用者可能會覺得麻煩。

Permission 門檻:Full Disk Access 與 Gatekeeper 那道牆

AppPorts 需要 Full Disk Access(完整磁碟存取權)才能讀寫 /Applications~/Library 下的資料目錄。第一次啟用要在「系統設定 → 隱私權與安全性 → 完整磁碟存取權」手動把 AppPorts 加進去並打開開關,App 內建會引導你直接跳到該設定頁。這個權限等級跟 FlowScrollmacUSB 這類需要觸碰系統層的 macOS 工具是同等級,不是裝完就能跑。

另外因為 AppPorts 未經蘋果開發者簽章(開源免費軟體常見狀況),第一次打開時 macOS 很可能會跳「AppPorts 已損毀,無法打開」並建議丟到垃圾桶。這不是檔案真的壞了,是 Gatekeeper 阻擋未簽章 App 的標準行為。作者在 README 提供的標準解除方式是在終端機執行:

xattr -rd com.apple.quarantine /Applications/AppPorts.app

這行指令移除的是 quarantine 屬性,不是關掉整個 Gatekeeper,風險等級比「全域允許任何來源 App」低得多。但 你得知道自己正在做什麼:這等同於告訴 macOS「我信任這個開源 App」,因此下載來源一定要是官方 GitHub Releases 或 appports.shimoko.com,不要從第三方軟體站抓來路不明的 dmg。

軟體門檻:NVMe 外接盒是實用底線

工具本身免費,但硬體配置決定體驗。AppPorts 的設計前提是你的外接儲存夠快,官方在 README 沒給精確的速率門檻,但 GitHub Issue #46(2026-06-06,未解)正是有使用者希望 AppPorts 能量化外接硬碟速率、告訴使用者「這顆硬碟跑不跑得動」。在作者把這個量化指標做出來之前,本文只能給你業界通用經驗:NVMe SSD 外接盒搭 Thunderbolt 3/4 是順暢底線,機械硬碟外接盒打開大型 App 會卡到你想關掉。這點與 OpenDisplay 把 Mac 當第二螢幕一樣需要頻寬,是硬體物理問題,工具克服不了。

順帶一提,AppPorts 在 v1.7.1(2026-06-24)加入了「自訂本地掃描目錄」功能,可手動加入 JetBrains Toolbox、Steam 這類把 App 裝在非 /Applications 目錄的工具位置,這是回應 Issue #48「偵測不到 JetBrains Toolbox 下載的軟體」。如果你是 JetBrains Toolbox 重度使用者,升級到 v1.7.1 以上才搬得動那些 IDE。

跟付費方案與原生方案的差距

ahhhhhfs 原文提到一款付費同類軟體 Lemur,但本文未獨立核實 Lemur 目前的功能與定價,因此只標示「ahhhhhfs 指稱有此付費同類工具」而不進一步描述,避免把未驗證的商業資訊寫進來。能客觀比較的是 macOS 原生方案:直接把 App 拖到外接硬碟、或用 ln -s 自己建 symlink,這兩條路徑 AppPorts 的 Stub Portal 都能做得更好(無箭頭、保護自更新、孤兒連結偵測)。另一種「正規」做法是蘋果在 macOS 15.1+ 讓 Mac App Store App 直接裝到外接硬碟,但這只對 App Store 裡的 App 有效,Xcode、Steam 遊戲庫這種大型第三方 App 完全幫不上忙。

適合誰、不適合誰

AppPorts 適合:256GB 或 512GB 乞丐版 Mac 使用者、同時裝 Xcode 與 Android Studio 的開發者、Steam 遊戲庫吃到百GB 的玩家、Final Cut Pro 或 Logic Pro 素材庫龐大的創作者。這群人的共同特徵是「本機空間壓力大、搬出去的 App 對隨機讀寫速度不像資料庫那麼敏感」。

不適合:把 Mac 當生產線、App 容器內含關鍵資料(微信、Adobe 工作專案、飛書企業帳號)且沒有備份習慣的人;使用機械外接硬碟的人;想把系統內建 App 也搬出去的人(AppPorts 會擋掉,但你硬幹就自負後果)。另一種邊界情境是 運行中的 App:AppPorts 會要求你先結束 App 再搬,如果你正在錄影、算圖、跑測試,請先存檔關掉再操作。

TL;DR:三句話結論

AppPorts 是一款 Apache-2.0 開源、SwiftUI 原生開發的 macOS App 遷移工具(repo wzh4869/AppPorts,1925★,v1.8.0 已於 2026-07-07 發布),能把 Xcode、Steam 庫、Final Cut 素材這類體積大、路徑不敏感的 App 搬到外接 SSD,並在原位留下無箭頭的 Stub Portal 啟動器,讓 Launchpad、Spotlight、macOS 26 App Menu 都把這個 App 當作還裝在本機。它能切實解決 256GB Mac 使用者最痛的空間問題,作者還加入了 Sparkle/Electron 系自更新 App 的鎖定保護、孤兒連結偵測、Ad-hoc 重簽章等傳統 symlink 給不了的機制。但它不是萬能搬運工:牽涉容器資料或綁定簽章的 App(微信、Adobe、飛書、Office)在 GitHub Issues 上有實際災情(#44、#51、#42),動手前一定要 Time Machine 備份;系統需求 macOS 12.0 以上、需要 Full Disk Access 權限、首次啟動要手動移除 quarantine 屬性,下載只走官方 GitHub Releases 或 appports.shimoko.com。

常見問題

AppPorts 會把我的 App 資料外送到雲端嗎?

不會。AppPorts 是本機檔案系統工具,做的是 /Applications 與外接儲存之間的檔案搬移與連結建立,所有資料都在你自己的機器與外接硬碟之間流動,沒有雲端上傳鏈路。它需要聯網的部分是 Sparkle 版本更新檢查(AppPorts 本身的自動更新),與 App 資料遷移無關。

搬完之後反悔了怎麼辦?

AppPorts 在 UI 提供「還原(Unlink)」按鈕,一鍵把 App 從外接硬碟搬回本機並移除連結。如果遷移過程被中斷(例如外接硬碟突然拔掉),下次打開 AppPorts 會自動偵測並嘗試復原;App 列表上會以紅色「Orphaned Link」標示斷掉的連結,讓你手動清理。

可以把 Xcode 整個搬出去嗎?

可以,這正是 AppPorts 最被推崇的使用情境之一。Xcode 本體加上 Simulator 資料、DerivedData 動輒數十GB,是 256GB Mac 最大的空間兇手之一。但要注意 Xcode 與 macOS SDK 版本綁定,跨 macOS 大版本升級時若 Xcode 尚未支援新版系統,搬出去的 Xcode 可能會無法啟動,這是蘋果本身的相容性問題,不是 AppPorts 造成。

AppPorts 自己怎麼下載更新?

AppPorts 透過 Sparkle 框架檢查更新,更新檔從 file.shimoko.com 拉取。截至 2026-07-22 最新版本是 v1.8.0(2026-07-07 發布),Release Notes 顯示兩位外部貢獻者新增了自訂目錄遷移與更安全的回滾流程。你也可以手動到 GitHub Releases 頁下載 dmg 安裝。

資料來源與取得方式

本文的機制描述、八種 App 遷移策略表、授權狀態與 Issues 引用,均以 AppPorts 官方 GitHub repo wzh4869/AppPorts 的 README、Release Notes(v1.6.1 至 v1.8.0)與 Issues 清單為準(截至 2026-07-22)。部分中文媒體對 AppPorts 的介紹仍停留在早期以 symlink 為主的階段,但本篇以 repo README 與 release notes 為權威——symlink 自 v1.6.1(2026-05-11)之後已不再是主要路徑。GitHub 計數(星數、fork 數、最後發版日)以 2026-07-22 當天查詢為準,會隨時間變動。下載請走 GitHub Releasesappports.shimoko.com 官方網站,避免從第三方軟體站抓到來路不明的 dmg。本篇沒有實機把 Xcode 或 Steam 庫搬到外接 SSD 跑完整流程,文章中所有「搬完之後會怎樣」的描述都是 README、Release Notes 與 Issues 的整理;如果你需要實測數字(載入時間、RAM 使用量、外接硬碟速率對應的順暢度)這類資料,建議參考 GitHub Issue #46 作者未來可能加入的量化指標,或自行在小成本 App 上先試。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 702

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...