torikatsu.dev

Flutterとかプログラミングとかガジェットとか書きます

【Flutter】プリコンパイルされたcloud_firestoreでビルド時間を短縮する

こんにちは、とりかつ(@torikatsu)です。

Flutter x Firebaseの組み合わせで開発をすることがよくあり、DBにCloud Firestoreを選択することも多いのではないでしょうか。 FlutterからCloud Firestoreを利用する場合はcloud_firestoreを使うことになると思います。

もしあなたがcloud_firestoreを利用している場合、もしかしたらiOSのビルド時間を 5分短縮 することができるかもしれません。

ビルド時間が短くなることによって開発体験が向上するだけでなく、GitHub Actionsのようなサービスの過金額の抑制にも繋がります。

そこで今回の記事ではcloud_firestoreを使っている場合にビルド時間を短縮するワザを紹介します。

なぜビルドが長いのか

なぜビルドが長いのでしょうか。 旧公式には次のようにありました。

Currently, the Firestore iOS SDK depends on some 500k lines of mostly C++ code which can take upwards of 5 minutes to build in Xcode.

firebase.flutter.dev

つまり、cloud_firestoreはiOSのFirestore SDKに依存しており、iOSのFirestore SDKはコード量が膨大なためビルドに時間がかかっているというわけでした。

じゃあどうしたらいいんだと思ったら旧公式に次のようにありました。

To reduce build times significantly, you can use a pre-compiled version

どうやらFirestore SDKコンパイルしたものが既に用意されているようです。これを使用することでFirestore SDKコンパイルのステップをスキップし、ビルド時間を短縮することが可能なようでした。

ビルド時間を短くする手順

プリコンパイルされたFirestore SDKを利用するためには、Podfileに1行追記するだけでOKです。

<project_root>/ios/Podfileを開き、target 'Runner' do ... endの中に次の1行を追記します。

pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '9.3.0'

これでビルドが早くなりました!

どれぐらい短くなったのか

たった1行書いただけじゃん。こんなんで本当に早くなるの?って疑問に思いますよね。

実際にビルドしてみました! (厳密なベンチマークは取っていないのであくまでもイメージとして)

高速化前

高速化後

ログのうちRunning Xcode buildiOSのビルド時間です。 高速化前は286.4sなのが、高速化後は11.7sと、4分57秒も速くなりました!!

こんなに速くなるならやらない手はないですね。

エラーが起きる場合

これを追記してflutter runしてみるとぶわぁぁぁってエラーが出ることがあります。

こんなエラー出たら焦りますよね。 でも冷静にエラーの内容を見てみます。 赤枠のあたりに注目すると...

    [!] CocoaPods could not find compatible versions for pod "FirebaseFirestore":
      In snapshot (Podfile.lock):
        FirebaseFirestore (= 9.3.0, ~> 9.3.0)

      In Podfile:
        FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `8.14.0`)

    None of your spec sources contain a spec satisfying the dependencies: `FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `8.14.0`),
    FirebaseFirestore (= 9.3.0, ~> 9.3.0)`.

これを要約すると「本当は9.3.0のバージョンが欲しかったのに、先ほどの手順でPodfileに追加したURLからは9.3.0のバージョンのFirestore SDKが見つからなかったよ」と言っています。

ちなみにさっきの手順で追記したやつは以下のようになっています。

gitにGitHubリポジトリのURL、tagにタグバージョンを指定することでそっからFirebaseFirestoreのプリコンパイルをダウンロードするように指定しています。

target 'Runner' do
  pod 'FirebaseFirestore', :git => 'gitのリポジトリのURL', :tag => 'gitのタグ'
end

先ほど指定していたGitHubリポジトリを覗いてみると...

github.com

なんと、Firestore SDKのバージョンに対応するようにタグが打ってあるようでした! 今回は9.3.0を要求されているため、以下のようにtag9.3.0に変更すればOKです!

target 'Runner' do
  pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '9.3.0'
end

ちなみに9.3.0を要求された、dartのcloud_firestoreのバージョンは3.4.0でした。

おわりに

今回の記事ではプリコンパイルされたiOS Firestore SDKを使ってFlutterのビルド時間を短縮するテクニックを紹介しました。

ビルドが長いことはそれ自体が時間が勿体無い上に、ビルド中にtwitterを触りたくなってタスクに戻れなくなったりなど、さらなる時間の浪費につながります。 ちょっとした工夫で済むのであれば、積極的にビルド時間を短くしていきたいですよね。