0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterのiOSビルドで使うfirestore-ios-sdk-frameworksのバージョンを自動で取得する

Posted at

これだけ

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 を見つけ出すためのコードになったのでもっと良い方法はあると思う。

これで毎回変えなくて済むようになったね!

結果

入れる前

image.png

入れた後

image.png

キャッシュが効いているのもあって、単純比較できないな。
ただ、早くなったのは確か。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?