【Xcodeビルド高速化】Shell Scriptを駆使して初心者でもカンタン!


対象

こんなことを思ってる人

  • Automator で作成した app のディレクトリをShell Scriptに渡したい
  • とりあえず簡単に Xcode でのビルドを高速化したい

Xcode でのビルド速度を高速化する方法は、 iOS アプリ開発者なら多くの方が知っていることでしょう。コマンドラインで1行のコマンドをたたくだけです。
ですが、今回は超初心者でも置くだけで高速化できるアプリを紹介するとともに、仕組みをご紹介します。
※どんなことよりも遊び心を優先しています。ご了承ください。

とりあえず速くしたい

環境:macOS
TuningXcode

TuningXcode.app をプロジェクトのルートディレクトリ( xcodeproj ファイルがあるところ)に置いてください。このアプリからプロジェクトが開けるようになります。ちなみに、起動と同時に高速化を行っているので、その他に必要な操作等はございません。

仕組み

  1. Apple Script で .app が置かれたディレクトリの絶対パスを取得する
  2. 絶対パスを Bash に渡す
  3. ビルド時間表示を有効にする
  4. ビルド高速化を有効にする
  5. プロジェクトファイルを開く

Apple Script で絶対パス取得

Automator で .app として書き出しを行った場合、 Apple Script なしでは .app が置かれたディレクトリの絶対パスを取得することができないようです。正直、ここが一番難しかったように感じます。

tell application "Finder"
    set thePath to (POSIX path of (path to me))
end tell
set AppleScript's text item delimiters to "TuningXcode.app"
text item 1 of thePath

$1 に絶対パスが渡されるので cd $1 として Shell Script を書けば、 .app が置かれたディレクトリで Shell を走らせることが可能になります。

高速化からプロジェクトを開くまで

CocoaPods を利用している場合にも対応させるために Shell Script の記述量が多めになっていますが、もっとカッコよく少ない行数で書けると思います。参考程度にご覧ください。

# .app が置かれたディレクトリに移動
cd $1

# ビルド時間表示を有効化
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
# CPUのコア数を取得
cores=$(system_profiler SPHardwareDataType | grep 'Total Number of Cores:' | sed -e 's/.*Cores: \([0-9]*\).*/\1/')
# 並列ビルドを有効化
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks `expr $cores \* 2`

# 開くプロジェクトファイル名を取得
fullFileName=$(ls | grep .xcodeproj)
fileName="${fullFileName%.*}"
extension='.xcworkspace'
newFileName=$fileName$extension
if [ -e $newFileName ]; then
  fullFileName=$newFileName
fi

# プロジェクトファイルを開く
open -a Xcode.app $fullFileName

並列ビルドに関してですが、HTT (ハイパースレッディング・テクノロジー)を考慮してCUPコア数の2倍に設定しています。
手動でCUPコア数を調べる必要もないので、この Shell Script を sh ファイルに保存して実行してもいいと思います(いや、それで十分だと思います)。

Automator に組み込む


あとは Automator に上記コードを入力して .app として出力するだけです。 .app 内のアイコンファイルを変更すれば好きなロゴにも変更できますし、色々おもしろいことができます。

どれくらい早くなるの?


パソコンのスペックやプロジェクトの大きさなどにもよりますが、軽量のアプリでは上記のような結果になりました。

こういったことをきっかけに、 Shell Script に触れるのも楽しいですね!