Unity の Firebase SDKがでかすぎる
Firebaseのインストールドキュメントによれば、Assetsにunitypackageを展開しろとある。
しかしこれは、SDKがでかすぎて、以降Githubにpushできなくなる罠である。
Git LFSを使うのはお金がかかるし、そこまで頻繁に切り替えるわけでもない。それに、SDKは過去のバージョン含めGoogleがホスティングしてくれている。自分でどこかに置いとくのも癪である。
そこで、
- レポジトリには「必要なFirebaseのバージョン」だけ記載
- Firebase SDKが欲しいとき、スクリプトでダウンロード
という運用にする。
SDKのインストール方法
Firebaseには隠しドキュメントがあり、そちらには他のインストール方法の説明がある。
tgzファイルを使う方法がシンプルで扱いやすい。tgzファイルたちは以下にリストされている。
(実はこれならぎりぎり100MBには収まる。でもでかいぞ)
tgzファイルをダウンロードしてローカルのどこかに置き、 manifest.json
でそれらtgzファイルを参照すれば良いんだ。
ダウンロードするスクリプト
そこで、 manifest.json
に記載のある Firebase SDK の tgz ファイルを、ローカルにダウンロードするスクリプトを書いた。
#!/usr/bin/env bash
set -euo pipefail
MANIFEST="Packages/manifest.json"
OUTPUT_DIR="GooglePackages"
BASE_URL="https://dl.google.com/games/registry/unity"
mkdir -p "$OUTPUT_DIR"
# --- manifest.json からファイル名一覧を取り出す ---
# - マニフェストに "file:../GooglePackages/com.google.firebase.xxx-1.2.3.tgz" のように書かれている前提
# - バージョンは数字とドットの繰り返しを許容
get_manifest_files() {
if [[ ! -f "$MANIFEST" ]]; then
echo "ERROR: manifest not found: $MANIFEST" >&2
return 1
fi
# パスが含まれていても basename のみ取り出す (sed 's!.*/!!')
grep -oE 'com\.google\.firebase\.[^"]+-[0-9]+(\.[0-9]+)*\.tgz' "$MANIFEST" \
| sed 's!.*/!!' \
| sort -u
}
# --- fetch: マニフェストに書かれた .tgz をダウンロード ---
do_fetch() {
echo "=== Fetch Firebase SDK packages ==="
get_manifest_files | while IFS= read -r filename; do
[[ -z "$filename" ]] && continue
# package-dir はファイル名から "-<version>.tgz" を取り除いたもの
package_dir=$(printf '%s' "$filename" | sed -E 's/-[0-9]+(\.[0-9]+)*\.tgz$//')
url="${BASE_URL}/${package_dir}/${filename}"
local_path="${OUTPUT_DIR}/${filename}"
if [[ -e "$local_path" ]]; then
echo "Exists, skip: $filename"
continue
fi
echo "Downloading $filename from $url ..."
if curl -fSL "$url" -o "$local_path"; then
echo "Saved: $local_path"
else
echo "Failed to download: $url" >&2
rm -f "$local_path" || true
fi
done
}
# --- clean: GooglePackages 内で manifest に無い .tgz を削除 ---
do_clean() {
echo "=== Clean unused Firebase SDK packages ==="
manifest_files=$(get_manifest_files) || manifest_files=""
# nullglob でマッチしないパターンを無視
shopt -s nullglob
for file in "${OUTPUT_DIR}"/com.google.firebase.*.tgz; do
fname=$(basename "$file")
if printf '%s\n' "$manifest_files" | grep -Fxq "$fname"; then
echo "Keep: $fname"
else
echo "Remove: $fname"
rm -f "$file"
fi
done
shopt -u nullglob
}
# --- メイン ---
case "${1:-}" in
fetch) do_fetch ;;
clean) do_clean ;;
sync) # fetch -> clean
do_fetch
do_clean
;;
*)
echo "Usage: $0 {fetch|clean|sync}"
exit 1
;;
esac
使い方
manifest.json
に使いたいFirebase SDKとバージョンを列挙。
{
"dependencies": {
// ...
"com.google.firebase.app": "file:../GooglePackages/com.google.firebase.app-12.8.0.tgz",
"com.google.firebase.auth": "file:../GooglePackages/com.google.firebase.auth-12.8.0.tgz",
"com.google.firebase.storage": "file:../GooglePackages/com.google.firebase.storage-12.8.0.tgz"
// ...
}
スクリプトを好きな名前 firebase_sdk.sh
とかで保存。
chmod +x firebase_sdk.sh
で実行権限を与えたら、
firebase_sdk.sh fetch
でダウンロード。
その後Unityでプロジェクトを開けば(UPM管理のpackageなので)勝手にimportされる。
tgzダウンロード先の GooglePackages
は.gitignore
に追加する。
運用例
- ブランチを切り替えてFirebase SDKのバージョンが変わったとき、fetchを手動で実行する
- Firebase SDKのバージョンを上げるとき
manifest.json
をいじってから、fetchを手動で実行する
おまけ機能の紹介
クリーン機能
firebase_sdk.sh clean
で、いまの manifest.json
にないtgzを削除
同期機能
firebase_sdk.sh sync
で、fetch & clean