← 返回开发日记

告别 Xcode 卡顿:把编译任务扔到云端 Mac mini M4 上

轻薄本与云端 Mac mini:本地写代码、远程跑 Xcode 编译
我的日常:面前是轻的本子,编译在机房的 M4 Mac mini 上跑。

我现在的主力机是一台很轻的笔记本——写 Swift、改 Storyboard、回消息都够用。但只要一点 Run,或者同事合并了个大 PR 触发全量编译,机器就开始表演:风扇拉满、触控板烫手、swift-frontend 在 Activity Monitor 里占满 CPU,Swift 补全跟着卡成 PPT。你肯定也干过这些事:删 Derived Data、重启 Xcode、祈祷 Indexing 早点结束。后来我才想明白:我不是非要让面前这台扛所有重活,只要把 xcodebuild、长索引、Archive 挪到一台一直插电的 Mac 上就行。

我现在的组合是:本地轻薄本 + 云端独享 M4 Mac mini。本子负责写代码、开会、摸鱼刷文档;机房那台 Remote Mac 负责编译、跑模拟器、出包签名。Windows 本只能写 Android 的同学也能这么玩,见 Windows + 云端 Mac 做 Xcode。要是你还纠结买不买 MacBook Pro,可以对照 本机 vs 租云端 Mac 的 TCO;CI 那头我另写过 自建 macOS Runner。下面是我实际在用的分工和命令,不是采购 PPT。

1)Xcode 卡,多半不是你会不会调,是机器在扛什么

我自己的观察:卡顿往往是好几件事叠在一起——SourceKit 扫全仓库、Indexing 占磁盘 I/O、Clean Build 时链接器把性能核吃光,模拟器再抢几 GB 内存。轻薄本为了续航会降功耗,编译超过三五分钟几乎必降频。Apple 的 构建效率文档 会教你拆模块、开增量,这些我都做过,能把 8 分钟压到 5 分钟——但当你每天 Clean 好几次,省下来的时间还是不够喝咖啡。

更烦的是「出差还得带能编得过 Archive 的本子」。我只想背 1.2kg 出门,酒店 Wi‑Fi 下却不得不开 Xcode 等半小时。把编译挪到机房的 M4 Mac mini 之后,笔记本终于又变回「终端 + 编辑器」,这个落差比换 CPU 还明显。

我现在的原则: 手在本地,肌肉在云端——交互跟手,算力跟插座。

2)我怎么拆:本子写代码,云 Mac 专门编

对我有用的分工大概是这样:

  • 本地: Git、Cursor/VS Code 或轻量 Xcode、设计稿、飞书。需要编译时 SSH 上去敲命令,本子风扇基本不响。
  • 云端 Mac mini M4: 完整 Xcode、固定一份 Derived Data、xcodebuild archive、偶尔 VNC 点模拟器。关键是独享——不像公司共享 Mac 那样被人登上去装测试包,磁盘和 CPU 不会突然被别人抢光。
  • 同一台机子挂 CI(可选): 注册 自建 macOS Runner,push 完去倒水,回来 PR 已经绿或红了。

选节点时我优先看 Git 远程在哪,不是我家宽带快不快——git fetch 和拉依赖慢一样折磨人。共享 macOS VM 我踩过坑,签名和性能都不稳,和 虚拟机 vs 真机 Mac mini 里写的一致:要正经跑流水线,就上裸金属。

3)三种用法,我推荐从 B 开始试

模式本地做什么云端 M4 做什么适合谁
A. 全远程 Xcode本子只开终端 / VNCGUI、模拟器、编译全在云上非 Mac 本;或老 Mac 只当屏幕
B. 混合(我最常用)本地改代码、push云上 xcodebuild / Fastlane想保留本地补全,又不想风扇起飞
C. 只把 CI 放云上日常仍开本地 XcodeRunner 7×24,夜间 ArchivePR 多、本地只编小 target

我一个人开发时用的是 B:白天本地改 SwiftUI,下班前 git push,云 Mac 上脚本跑 Archive 传 TestFlight,我不用守着进度条。团队稍大一点就 B+C:大家本子不再被 20 分钟 Clean Build 绑架,合并请求统一在云 Mac 上编。如果你已经用 Cursor 写 Swift,Remote-SSH 把终端指到云主机就行——IDE 还是熟悉的,只是 xcodebuild 在对面跑。

4)要不要上云 Mac?我对照这几条自检

你的信号继续优化本机加云端 M4 Mac mini
Clean Build > 5 分钟且每天多次换 SSD、关多余 Target 有帮助但有限建议上云,增量构建留在云端磁盘
风扇噪音影响开会/录音降分辨率、关模拟器仅缓解编译迁出,本机静音
需要最新 Xcode + 旧 macOS 本无法升级被迫换电脑云 Mac 随镜像升级,本机不用动
每天要摸 2 小时模拟器调 UI本地 Mac 仍必要云 Mac VNC 调模拟器;或本地+云各管一块
飞机/高铁离线改代码本地必须能编译云无法替代离线;可本地轻编、回公司云编

我拿不准时会在云 Mac 上对真实仓库跑一轮全量 Archive,和本机计时对比——比看任何测评都管用。很多同事不是缺 Mac,是缺「编译高峰那几小时」的算力;为峰值租一台机,比再买顶配本扛 365 天闲置划算得多。

5)我搭环境时的顺序(可直接照着做)

  1. 选地区: 跟 GitHub/GitLab、制品库同区或近区,git clone 和上传 App Store Connect 都省心跳。
  2. 装 Xcode: SSH 上去,App Store 或 xcode-select 装和项目一致的版本;开编前扫一眼 发布说明,别 macOS 太旧签不了当前 SDK。
  3. 钉死 Derived Data: 我在 ~/.zshrc 里写 export DERIVED_DATA_PATH=~/DerivedData。路径飘了等于每次假 Clean,增量构建白搭。
  4. 拉代码、配签名: git pull 或让 Runner 检出;证书我习惯 Fastlane Match,偶尔要信任设备就 VNC 点一下。
  5. 从本子触发编译: 一条 SSH 就够,例如:
    ssh build@cloud-mac 'cd ~/app && xcodebuild -scheme App -destination generic/platform=iOS build'
    懒得敲就写进 Makefile,或者 push 交给 Runner。

网络上别被「我家千兆」忽悠——编译时我更在意 SSH 别断、上传 IPA 别抖。公司 VPN 慢的话,要么云 Mac 放出口友好的区,要么按安全规范让云 Mac 直连内网 Git。第一次全量编完,云端 Derived Data 热起来,后面增量会快一截;机房机器不天天合盖睡眠,这也是它比笔记本适合当构建机的原因。

6)我踩过的坑(能避则避)

本地和云端各编一套 Derived Data: 我干过,两边时间对不上,还以为 Xcode 抽风。现在规定「主构建机只有云 Mac」,本地最多开个小 Target 看语法,或者只跑 swift build 摸模块。

模拟器放哪: 调 UI 像素我会 VNC 到云 Mac 的模拟器;功能测试则真机插本子,包让云 Mac 打,TestFlight 下发——本子不用同时扛模拟器 + 编译。

并行度: M4 内存够的话我会在云主机上把 SWIFT_EXEC_JOBS 调高一点(先看内存别爆),比在 8GB 轻薄本上硬顶靠谱。

和 CI 共用一台机: Runner 最好单独用户或排队,别我一边 VNC 改东西一边 Job 在磁盘上狂写——会互相拖死,容量规划见 这篇

7)钱怎么算:我把它当「第二台编译机」的租金

自己再买 Mac mini 要硬件、显示器、电费,还得有人管断电重启。我冲刺版本时开周租,平时只让 CI 占着月租席位,比为了编译专门买 MacBook Pro 轻多了。具体价格看 定价页;若你在算「值不值得买新本」,这篇 TCO 和我结论差不多:日常本轻薄,重活在云端

整台 Mac 当远程桌面用、不只是编译,可以看 虚拟桌面接入。这篇只聊我把 Xcode 编译迁出去这件事。

8)同事常问我的几句

远程编会比本机慢吗?
点按钮、拖模拟器会吃延迟;但编译十分钟以上那种,我这边 M4 云机经常比降频的本子快。我日常是混合:改代码本地,编 cloud。

只有 Windows 本能搞吗?
能。我组里 Android 同学就这么出 iOS 包,见 这篇

和 Mac VPS 有啥区别?
我要签 App Store、跑稳定 CI,只信独享 Apple 芯片真机,共享 VM 出过奇怪的性能和证书问题。

代码放云上慌不慌?
和放公司角落一台 Mac mini 一样:SSH 密钥、别把 p12 提交 Git、能限 IP 就限。我们内网还有堡垒机。

多久能打出第一个 Archive?
我熟的话当天下午:SSH、装 Xcode、拉仓、配描述文件。新手上 帮助中心 跟着做也行。

旧 Mac 还要升级吗?
只写代码不本地全量编的话,旧机器还能再战;瓶颈在编译再租云 Mac,不必为 Xcode 单独买顶配。

我用的基础设施(供你对照)

编译机我放在 Nuvcloud 的独享 M4 Mac mini 上:SSH/VNC、按日/周/月开,不用和陌生人抢一台「云 macOS」。个人赶版本、小团队共一台构建机都够。

日租拿自己的工程跑一轮 Archive,和本机比时间——看定价与节点 · 开通

LIMITED 限时优惠