これだけ
FlutterでiOSをビルドする時にFirebaseを含んでいるとビルドにめちゃんこ時間がかかる。
そういう時は firestore-ios-sdk-frameworks を使おうというのは知られている。
ただ、どの記事を読んでも、バージョンを固定で設定している。
Renovateとかを導入していたらfirestore-ios-sdk-frameworksのリリースがあるとPRは建てられるが、いやいや、Flutterで使っている firebase_core とバージョンをリンクさせたいよね。
以下のコードをPodfileに書くんや。
# pub cacheからFirebase SDKのバージョンを取得する
def load_firebase_sdk_version
# pubspec.lockを取得
pubspec_lock = File.join(File.dirname(__FILE__), '..', 'pubspec.lock')
# pubspec.lockが存在しない場合は早期リターン
return nil unless File.exist?(pubspec_lock)
require 'yaml'
lock = YAML.load_file(pubspec_lock)
firebase_core = lock.dig('packages', 'firebase_core')
# firebase_coreが見つからない場合は早期リターン
return nil unless firebase_core
# firebase_coreのバージョンを取得(例: "4.1.0")
version = firebase_core['version']
# pub cacheのパスを環境変数から取得、なければデフォルトパスを使用
pub_cache = ENV['PUB_CACHE'] || File.join(ENV['HOME'], '.pub-cache')
cache_path = File.join(pub_cache, 'hosted', 'pub.dev', "firebase_core-#{version}", 'ios', 'firebase_sdk_version.rb')
# ファイルが存在する場合のみ読み込み
if File.exist?(cache_path)
# firebase_sdk_version.rbをrequire(firebase_sdk_version!関数が定義される)
require cache_path
# Firebase SDKのバージョン文字列を返す(例: "12.2.0")
firebase_sdk_version!
else
# デバッグ用:ファイルが見つからない場合に警告を出力
Pod::UI.warn "firebase_sdk_version.rb not found at #{cache_path}"
nil
end
end
$FirebaseSDKVersion = load_firebase_sdk_version
target 'Runner' do
# 前略
# invertase/firestore-ios-sdk-frameworksを使用してビルド時間を短縮
if $FirebaseSDKVersion
Pod::UI.puts "Using precompiled Firestore binaries for Firebase SDK #{$FirebaseSDKVersion}"
pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => $FirebaseSDKVersion
end
# 後略
end
解説
これはClaude Codeに作ってもらったがうまく動いているので解説する。
まずCI上での実行を考慮して作っている。
最初は.symlinkから取得しようとしてたけど、CI環境とかだと.symlinkの位置がローカルと異なる場合があったりで不安定だった。
なので、pubspec.lockからfirebase_coreのバージョンを取得して、.pub_cacheの該当のバイナリまでのパスを作成し、 firebase_sdk_version.rb を見つけ出す。
その中のバージョン番号を使うという流れにした。
ほとんど firebase_sdk_version.rb を見つけ出すためのコードになったのでもっと良い方法はあると思う。
これで毎回変えなくて済むようになったね!
結果
入れる前
入れた後
キャッシュが効いているのもあって、単純比較できないな。
ただ、早くなったのは確か。

