Carthageに移行したらビルド時間が1.08倍速くなった!

あれ...たったの1.08倍?

そう思われると思いますが事実ですw

理由としては、RxSwiftなどビルドに時間がかかるライブラリがCarthageに移行できなかったからですが、このあたりの話も含めてCocoaPods管理からCarthage管理に移行した件について共有させていただきます。

作業環境

作業環境は以下の通りです。CarthageがXCFrameworkに対応してから移行作業を行ったので、ワークアラウンド等の必要もなくすんなり導入できました。

  • Xcode: 12.5
  • Carthage: 0.38.0

ライブラリをCocoaPods管理からCarthage管理に移行する手順

Carthageを使ってライブラリをインストールする手順はググれば山のように出てくるので割愛するとして、ここではどのようにCarthageに移行したかを説明します。

全てのライブラリがCarthageに対応しているわけではないので、まずは自分が使っているライブラリのうちどれがCarthageに対応しているかを調べます。Carthageに対応しているかどうかはそのライブラリのREADMEなどを確認すればOKです。

例えばKingfisherであれば、READMEに以下の記載があるのでCarthage対応していることがわかります。

f:id:bamboohero:20210516021955p:plain:w600

Carthage対応しているライブラリが把握できたら、1ずつ移行していきます。流れはこんな感じです。

  • Podfileから該当のライブラリを削除し、pod installを実行する(Podfile.lockから該当のライブラリが削除される)
  • Cartfileに該当のライブラリを追記し、carthage update <ライブラリ名> --use-xcframeworks --platform iOSを実行する
  • プロジェクトにビルドされたフレームワークを追加し、アプリが正常に起動することを確認する
  • アプリが起動し動作も問題ないことが確認できたら、変更をコミットする

この作業をライブラリごとに繰り返していきます。複数のライブラリを一気に移行しても問題ないかもしれませんが、私は念の為一つずつ移行しました。

Carthage移行できなかったもの

大物であるRxSwiftとFirebase SDKをCarthageに移行することができませんでした。ビルド時間が大きく改善されなかったのはこのせいかなと思っています。

なぜ移行することができなかったのか説明したいと思います(こうすればできるよ!というコメントお待ちしておりますw)。

RxSwift

RxSwift自体はCarthageに対応しているのですが、RxSwiftの関連ライブラリであるRxKeyboardが原因で移行ができませんでした。

RxKeyboardはバイナリインストールのみ提供されています。

READMEに記載の通りインストールを試したのですが、以下のエラーが出たためバイナリがインストールされませんでした。

Incompatible Swift version - framework was built with 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28) and the local version is 5.4 (swiftlang-1205.0.26.9 clang-1205.0.19.55).

Swift5.4でビルドしたバイナリが提供されるのを待つしかないんですよね、きっと。

RxKeyboardがCocoaPods管理に残るということは、依存ライブラリであるRxSwiftもCocoaPodsでインストールされてしまいます。CarthageでRxSwiftをビルドしてプロジェクトに追加しようとすると、CocoaPods経由で作成されたRxSwiftのフレームワークとぶつかってビルドエラーになってしまうので、RxSwiftだけCarthageで入れるということもできませんでした(CocoaPods経由のフレームワークは使用しないという設定はできるのかな?)

Firebase SDK

Firebase SDKのGithubに記載がありますが、Carthageによるインストールは提供されてはいるものの、Experimentalとなっています。つまり公式にはサポートしていないということですね。

Experimentalなので導入には不安があるというのと、あまり深くは追ってないですが、公式にサポートされる様子も今のところなさそうなので、CocoaPods管理のままとしました。

ビルド時間の計測方法

ビルドする前に、ターミナルで以下のコマンドを実行し、Xcode上でビルド時間を表示できるようにします。

defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES

コマンドを実行してXcodeを再起動した後にビルドすると、以下のようにビルドにかかった時間が表示されます。

f:id:bamboohero:20210516025203p:plain

あとは、⌘+Bでビルドをするだけです。ビルド後にProduct > Clean Build Folderをクリックしてビルドをクリーンし、またビルドを実行する、という手順で3回ビルドを実行し、その平均時間をビルド時間とします。

なお、初回のビルドは長めに時間がかかるので、2回目以降の3回分の時間を使用します。

計測結果は以下のようになりました。Carthage移行前と比較して、1.08倍ビルド時間が速くなりました。

プロジェクトの状態 ビルド時間(s) 平均ビルド時間(s)
Carthage移行前 153.513, 158.206, 163.603 158.441
Carthage移行後 144.286, 144.996, 149.810 146.364
(プロジェクト最新化前) 116.516, 120.692, 122.890 120.033

ちなみに、以前の記事で2年ぶりにプロジェクトを最新化した件について触れたのですが、最新化する前のビルド時間は120.033sとだいぶ短い時間でした。おそらくですが、RxSwift、Firebase SDKが2メジャーバージョンくらい上がったりしたので、それらのビルド時間が長くなったのかもしれません。

bamboo-hero.com

まとめ

私の個人アプリにおけるCarthage移行の話をさせていただきました。

ビルド時間がほとんど変わらないという残念な結果になってしまいましたが、、RxKeyboardの件についてはちょっと待てば対応される気がするので、それに期待してみます!

あとは、Swift Package Managerも気になってるので、そちらを導入したら記事にしようかなと思います。