ビルド中に Mac をスリープさせない:macOS での Xcode と Docker
ビルドには 40 分かかります。始めてコーヒーを取りに行き、戻ると Mac は 20 分前から眠っています。
なぜビルドで起きるのか
ビルドはプロセッサを使い切りますが、入力は一つも生みません。macOS はスリープを負荷ではなく、キー入力やマウスの動きがない時間で決めます。システムから見ると、誰も前にいません。
Xcode やビルドツールが自分でアサーションを出すかどうかは、ツールと呼び出し方によります。確かめていないなら当てにしないほうが安全です。
眠ったときに起きること
Mac が眠るとビルドは止まります。目覚めるとそのまま続くことも多いのですが、いつもではありません。ネットワーク接続はたいてい切れていて、依存関係を取得していた段階はタイムアウトで失敗します。
Docker ではもう一段あります。コンテナは Mac と一緒に眠る仮想マシンの中で動いています。その後の失敗はスリープのようには見えず、たまたまのネットワークエラーに見えます。
最後まで走らせる二つの方法
ターミナルでは、caffeinate -i がコマンドの実行中だけ Mac を起こしておきます。たとえば caffeinate -i make です。正確ですが、毎回コマンドの前に付ける必要があります。
Toxin なら、ビルドの前に予想時間を十分に超える時間を選ぶか、終わりが読めないビルドには無制限のセッションを始めます。残り時間はパネルに表示され、その後はシステム設定のとおりに戻ります。
夜通し、蓋を閉じたまま
夜通しのビルドなら 12 時間で足ります。Toxin は画面も点けておくので、不要なら明るさを下げてください。
ビルド中に MacBook を閉じるなら蓋モードが必要です。蓋を閉じることは macOS の別のルールだからです。全負荷のビルドは蓋を閉じると熱くなるので、バッグの中ではなく風通しのよい場所に置いてください。
それでもビルドが途切れたら
- アイコンを見る:輪郭だけならセッションは動いていなかった。
- 時間が短すぎた?パネルで終了時刻を確かめる。
- 蓋モードなしで蓋を閉じた?それなら macOS が Mac を眠らせた。
- 途中でネットワークエラー?多くはスリープの跡。
よくある質問
caffeinate で十分では?
ターミナルの単発のコマンドなら十分です。ビルドを Xcode やほかのアプリ、いくつもの手順から動かすなら、呼び出しを毎回書き換えずに済む Toxin のほうが楽です。
Toxin でビルドは遅くなりますか?
いいえ。Toxin はアサーションを出すだけで、ほかに計算はしません。ビルドは Toxin がないときと同じ性能で動きます。
途切れたビルドで失うのは計算時間より注意力です。Toxin は望むだけ Mac を起こしておきます。macOS 用のメニューバーアプリで、まだ Mac App Store にはありません。