在雲端 Mac 上搭建遠端開發工作流:VS Code Remote-SSH 與 JetBrains Gateway 調優實戰

遠端 Mac ·約 7 分鐘閱讀

在雲端 Mac 上搭建遠端開發工作流:VS Code Remote-SSH 與 JetBrains Gateway 調優實戰

凌晨兩點,你在家裡用筆電連上租的那台雲端 Mac mini,準備把白天沒跑完的建置接著跑。VS Code 彈出「正在安裝遠端擴充套件」的進度條,足足轉了四十秒——擴充套件清單跟昨天一模一樣,卻又被重新裝了一遍。這種「每次都像初次見面」的體驗,是很多人第一次把編輯器搬到雲端 Mac 上時踩的第一個坑,後面還有網路抖動斷會話、圖形除錯用不了等著你。這篇文章把這幾個問題一次性理清楚。

為什麼把編輯器搬到雲端 Mac 而不是本機開發

如果只是偶爾登入跑一次 xcodebuild,直接 SSH 進去打指令就夠了。但如果你長期在雲端 Mac mini 上寫程式、除錯、跑測試,靠裸終端 + vim 的效率會明顯低於本機 IDE 的體驗——沒有語意跳轉、沒有中斷點除錯,剪貼簿同步還要額外設定。更合理的做法是讓 Mac mini 只負責運算與編譯,編輯器介面留在本機端,透過遠端協定把兩者串起來。這也是「雲端 Mac」這類服務真正的用法:機器是獨享的實體資源,你把它當成放在資料中心裡自己的電腦,而不是用完就丟的臨時容器。

用 VS Code Remote-SSH 打通雲端 Mac

VS Code Remote-SSH 的原理很直接:本機只跑一個輕量客戶端,真正的語言服務、終端機、檔案系統全在遠端 Mac 上。首次連線時它會把一個 vscode-server 二進位檔和擴充套件宿主裝到遠端的 ~/.vscode-server 目錄,後續連線會重複使用這套環境。

SSH 設定與連線多路復用

預設情況下,每次連線都要重新完成一次完整的 TCP + SSH 交握,在跨太平洋存取亞太或美西節點時,這段延遲會直接反映在「點開檔案要等一下」上。用 ControlMaster 做連線多路復用能省掉大部分交握開銷:

# ~/.ssh/config
Host omac-jp
    HostName <你的節點 IP>
    User devuser
    Port 22
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 10m
    ServerAliveInterval 30
    ServerAliveCountMax 3

ControlPersist 10m 表示主連線斷開、視窗關閉後,還會保留 10 分鐘的復用通道,期間新開的終端機分頁、VS Code 重新連線都走這條舊通道,省去重新協商加密的時間。ServerAliveInterval 則用來對付某些電信業者的 NAT 會悄悄斷掉閒置連線的問題。

擴充套件快取與索引加速

前面提到的「每次重裝擴充套件」,根本原因通常不是 VS Code 的問題,而是每次連線的遠端主機變了——比如你在主控台裡重裝了系統,或換成另一個執行個體。只要固定用同一台機器,~/.vscode-server 裡的擴充套件、語言伺服器快取、TypeScript/Swift 的索引都會持續保留,第二次之後的連線應該是「秒開」。

如果你的專案體積較大(比如包含多個 target 的 Xcode 專案),可以在遠端提前跑一次全量索引再斷線,讓快取先熱起來:

cd ~/Projects/MyApp
xcodebuild -project MyApp.xcodeproj -scheme MyApp -showBuildSettings > /dev/null

這一步不會產出可執行檔,但會讓 Xcode 的索引資料庫先建好,後續在編輯器裡跳轉定義時不用現場重建。

JetBrains Gateway 的適用場景與限制

如果你的團隊同時有後端服務(比如用 Kotlin/Go 寫的 API)也部署在同一台雲端 Mac 上,JetBrains Gateway 是另一個選項:本機裝一個輕量客戶端,遠端跑完整的 IDE 後端(IntelliJ IDEA、GoLand 等),渲染結果透過自研協定傳回本機,體驗比純 Web IDE 更接近本機作業。

Gateway 的邊界很清楚:它服務的是「有對應 JetBrains IDE」的語言生態。Xcode 專案、Interface Builder、Swift Playground 這些蘋果生態專屬工具,Gateway 並不涵蓋。

也就是說,在雲端 Mac 上做純 iOS/macOS 開發,主力工具鏈還是 VS Code Remote-SSH(寫程式、跑腳本、看日誌)搭配終端機裡的 xcodebuild,Gateway 更適合團隊裡那些「順帶用同一台 Mac 跑後端服務」的場景。

用 tmux 保留會話,應對網路抖動

不管用哪種遠端編輯方案,只要底層連線是 SSH,就存在斷線風險——出差路上切換 Wi-Fi、家裡路由器重開,都會讓連線瞬間中斷。如果這時候正好在跑一個耗時 40 分鐘的建置,直接斷線就意味著建置行程被殺、前功盡棄。

解法是讓所有耗時任務都在 tmux 會話裡啟動,而不是直接掛在 SSH 會話下:

ssh omac-jp
tmux new -s build
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp \
  -destination 'generic/platform=iOS' build 2>&1 | tee build.log

斷線之後重新連線,執行 tmux attach -t build 就能接回剛才的終端機輸出,建置行程完全沒受影響。這個習慣不只對建置有用,長時間跑的模型微調、日誌監聽、fastlane 打包腳本都應該套進 tmux。

場景 建議工具 原因
日常寫程式、看日誌 VS Code Remote-SSH 語意跳轉 + 終端機一體化,連線多路復用後回應快
團隊後端服務(非 Xcode) JetBrains Gateway 完整 IDE 體驗,但不支援 Xcode 專案
長耗時任務(建置/訓練) tmux / screen 斷線不中斷行程,可隨時接回
需要圖形介面(Instruments、Interface Builder) 螢幕共享 / VNC 唯一能看到真實 GUI 的方式

圖形除錯怎麼辦:VNC/螢幕共享的取捨

命令列能解決大部分場景,但有些工作繞不開圖形介面:用 Instruments 看記憶體時間軸、調整 Interface Builder 裡的約束、或者只是想確認某個 UI 在真實渲染下的樣子。這時候要切到螢幕共享(VNC),體驗跟命令列完全不同——延遲更敏感,建議把解析度降到實際需要的範圍(例如 1440×900 而非 4K),色深調到「數千色」檔位,能明顯改善跨區域存取時的流暢度。日常開發建議以 SSH + 編輯器為主,圖形介面按需臨時開啟,不要讓 VNC 長駐佔用頻寬。

檢查清單與踩坑記錄

把這套工作流落地前,過一遍下面幾項:

常見問題

VS Code Remote-SSH 每次重新連線都要重裝擴充套件,怎麼辦?

擴充套件安裝在遠端 ~/.vscode-server 目錄,只要不清空該目錄且遠端主機不變,擴充套件與索引會一直保留;真正的重裝通常是因為切換了不同的伺服器實例或做了系統重裝,可在租期內固定同一台機器來避免這個問題。

JetBrains Gateway 支援 Xcode 相關的開發嗎?

Gateway 面向 JVM、Node、Go、Python 等有對應 JetBrains IDE 的語言,不支援 Xcode 專案;Swift/Objective-C 開發仍需用 VS Code Remote-SSH 搭配終端機裡的 xcodebuild,或直接用畫面共享開啟 Xcode 圖形介面。

網路抖動導致 SSH 斷線,正在跑的構建會中斷嗎?

只要構建行程是在 tmux 或 screen 會話裡啟動的,SSH 斷線不會終止會話內的行程,重新連線後用 tmux attach 就能接回原來的輸出,不必重跑。

HireVPS

今天就試試獨享雲端 Mac mini

按日起租,2 分鐘取得 SSH/VNC 憑證,配置隨時可升級。

立即租用 Mac mini