こんにちは。iOSアプリエンジニアの @zrn-ns です。
結構前の話になりますが、Xcode11にアップデートしたあたりからiOSプロジェクトのビルド速度が遅くなり始め、気づくと差分ビルドにかかる時間が1分を超えるようになっていました。
発生した問題
差分ビルドで1分かかるのは流石に遅すぎるので原因を調査したところ、R.swiftの実行に50秒近くかかっている事がわかりました。
R.swiftは、ターゲット内に含まれるリソースファイルのパスを集約した構造体を生成してるOSSです。
画像ファイルやjsonなどのリソースを取得するとき、ファイル名やパスを直接指定してしまうとファイル名の変更を行ったときなどに実行時エラーを引き起こしてしまいますが、R.swiftを使用すればファイルに静的にアクセスできるため、そういった危険性を排除できます。
プロジェクトでは3ターゲットでR.swiftで実行していたので、1ターゲットあたり15秒くらいかかっていたと思います。
調査
そもそも全てのファイルを走査するような処理に時間がかかるというのは当たり前のことだと思っていたので、最初はR.swift側の改善を待とうかな、なんて考えていたのですが、一向に同じような現象に悩まされている人がいないようだったので、うちのプロジェクト側の設定の問題を疑い始めました。(基本的に問題が起きると自分側の問題💀)
しばらく調べていると、下記のIssueへのコメントを見つけました。
https://github.com/mac-cain13/R.swift/issues/479#issuecomment-575534254
With just one line **/CampaignsAndFormats.strings it was increasing script time from 4 to 11 seconds.
原因
コメントで書かれていたのは、 **/
を使うとスクリプトの実行時間が大幅に増加するということ。
あれ、と思い .rswiftignore
(R.swiftの除外設定ファイル)を開いてみると、そこには下記のようなパスが記されていました。
**/*.storyboard
**/*.xib
改善
どうやらこのパス指定が原因だったようです。
別にstoryboardとxibを除外する必要もなかったのでこの設定ファイルを削除したところ、R.swiftの実行スピードが6秒まで短縮されました。
(1ターゲットあたり2秒程度)
この時間なら全然許容できます。
感じたこと
再帰的なワイルドカード **
を使うと処理が重くなるようです。
これはR.swiftに限らず、Unix環境全般で言えるのだと思うのですが、調べてもそういう情報を見つけられませんでした。
(詳しい人がいたら教えて下さい...)
今後は同様の問題を起こさないように気をつけたいなと感じました。
少しでも、同じような問題で苦しんでいる人の力に慣れれば幸いです。ではでは。