1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unity Firebase SDKが大きすぎるので必要なときだけ手動ダウンロードするスクリプトを書いた

Last updated at Posted at 2025-09-29

Unity の Firebase SDKがでかすぎる

Firebaseのインストールドキュメントによれば、Assetsにunitypackageを展開しろとある。
しかしこれは、SDKがでかすぎて、以降Githubにpushできなくなる罠である。

Git LFSを使うのはお金がかかるし、そこまで頻繁に切り替えるわけでもない。それに、SDKは過去のバージョン含めGoogleがホスティングしてくれている。自分でどこかに置いとくのも癪である。

そこで、

  1. レポジトリには「必要なFirebaseのバージョン」だけ記載
  2. 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

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?