local-build について
Expo と React Native のプロジェクト向けに、Android APK と iOS シミュレーター用 .app を生成するローカルリリースビルドスクリプトを作成するスキルです。プロジェクト設定から識別情報を読み取り、プラットフォームのツールチェーンを使って、ローカルテストや E2E 用の成果物を固定パスに出力します。
主な機能
- 01Android リリース APK 用スクリプトの生成
- 02iOS シミュレーター .app 用スクリプトの生成
- 03Expo 設定からアプリ識別情報を取得
- 04固定パスでビルド成果物を置き換え
- 05ビルド成果物ディレクトリを .gitignore に追加
活用シーン
- 01Android 端末テスト用 APK のビルド
- 02E2E テスト用 iOS シミュレータービルドの作成
- 03チーム内プレビュー用ビルド成果物の準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ code-with-beto/ skills --skill local-buildインストール後、Claude Code で/local-buildを入力して読み込まれたか確認します。
詳細
ローカルビルドのワークフロー(APK と .app)
概要
プラットフォームのツールチェーンを直接使用して、Expo / React Native プロジェクトのリリース成果物をビルドする 2 つのシェルスクリプトを生成します。
scripts/build-android.sh→./gradlew assembleReleaseを実行し、APK をbuilds/にコピーしますscripts/build-ios.sh→ iOS シミュレーター用にxcodebuildを実行し、.appをbuilds/にコピーします
どちらのスクリプトも実行するたびに以前の成果物を置き換えるため、出力先のパスは常に予測可能です。
このワークフローが必要な理由: Expo プロジェクトのデバッグビルドには expo-dev-client が含まれ、アプリの UI ではなく「Development Servers」の選択画面が起動します。E2E テスト、チームメイトへのプレビュー、実機へのインストールには Release ビルドが必要です。このスクリプトでそのビルドを作成できます。
ステップ 0:プロジェクトが React Native / Expo アプリであることを確認する
ほかの作業を始める前に、現在のディレクトリが Expo / React Native プロジェクトであることを確認します。
dependenciesにexpoが含まれるpackage.jsonがあることを確認します。app.jsonまたはapp.config.ts/app.config.jsがあることを確認します。
どちらも見つからない場合は作業を中止し、このスキルは Expo プロジェクト内でのみ動作することをユーザーに伝えてください。
ステップ 1:Expo 設定からアプリの識別情報を読み取る
スクリプトには、ユーザーのプロジェクトに固有の 3 つの値が必要です。「YourApp」をハードコードしたり、名前を決めつけたりしないでください。 設定から値を読み取ります。
抽出する値
| 値 | 確認する場所 | 用途 |
|---|---|---|
name | app.config.ts / app.config.js / app.json → expo.name | iOS のスキームと .app のファイル名 |
slug | expo.slug | APK のファイル名(フォールバック:name を小文字にした値) |
ios.bundleIdentifier | expo.ios.bundleIdentifier | xcrun simctl launch コマンド |
android.package | expo.android.package | adb shell am start コマンド |
各設定形式の読み取り方
app.json— 通常の JSON なので、そのまま解析します。トップレベルのキーは通常expoです。app.config.ts/app.config.js— 設定を返す関数をエクスポートします。ファイルを読み、返されるオブジェクトからリテラル値を抽出します。実行しようとしないでください。値が動的に計算されている場合は、何を使用するかユーザーに確認してください。
iOS のスキームがディスク上に存在することを確認する
iOS のスキームファイルは、expo prebuild の実行時に expo.name から生成されます。スクリプトに設定する前に、存在することを確認してください。
ls ios/*.xcworkspace 2>/dev/null
ls ios/*.xcodeproj/xcshareddata/xcschemes/*.xcscheme 2>/dev/null
.xcworkspace の名前と .xcscheme ファイル名(拡張子を除く)は、xcodebuild -workspace と -scheme に渡す値です。通常は expo.name と一致しますが、一致しない場合は、ディスク上の名前を使用してください。
ios/ または android/ がまだ存在しない場合は、次を実行します。
npx expo prebuild
その後、スキームを再確認してください。
ステップ 2:Android ビルドスクリプトを作成する
scripts/build-android.sh を作成します。<SLUG> をステップ 1 の値に置き換えてください。
#!/usr/bin/env bash
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(cd "$HERE/.." && pwd)"
ARTIFACT="$ROOT/android/app/build/outputs/apk/release/app-release.apk"
DEST_DIR="$ROOT/builds"
DEST="$DEST_DIR/<SLUG>.apk"
echo "==> Building Android release APK"
cd "$ROOT/android"
./gradlew assembleRelease
if [ ! -f "$ARTIFACT" ]; then
echo "Build did not produce $ARTIFACT" >&2
exit 1
fi
mkdir -p "$DEST_DIR"
rm -f "$DEST"
cp "$ARTIFACT" "$DEST"
echo "Done: $DEST"
注意:
assembleReleaseが必要です。assembleDebugはアプリではなくexpo-dev-clientを起動します。- プロジェクトでリリース署名が設定されていない場合、Gradle はデバッグキーストアにフォールバックします。ローカルテストには問題ありませんが、Play Store への提出には使用できません。
ステップ 3:iOS ビルドスクリプトを作成する
scripts/build-ios.sh を作成します。<SCHEME> をステップ 1 の値に置き換えてください(-workspace <SCHEME>.xcworkspace と -scheme <SCHEME> に使用する文字列と同じで、出力ファイルは <SCHEME>.app です)。
#!/usr/bin/env bash
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(cd "$HERE/.." && pwd)"
ARTIFACT="$ROOT/ios/build/Build/Products/Release-iphonesimulator/<SCHEME>.app"
DEST_DIR="$ROOT/builds"
DEST="$DEST_DIR/<SCHEME>.app"
echo "==> Building iOS Simulator .app (Release)"
cd "$ROOT/ios"
xcodebuild \
-workspace <SCHEME>.xcworkspace \
-scheme <SCHEME> \
-configuration Release \
-sdk iphonesimulator \
-derivedDataPath build \
CODE_SIGNING_ALLOWED=NO \
-quiet
if [ ! -d "$ARTIFACT" ]; then
echo "Build did not produce $ARTIFACT" >&2
exit 1
fi
mkdir -p "$DEST_DIR"
rm -rf "$DEST"
cp -R "$ARTIFACT" "$DEST"
echo "Done: $DEST"
注意:
-sdk iphonesimulatorはシミュレーター用の.appを生成します。実機では動作しません。CODE_SIGNING_ALLOWED=NOはシミュレータービルドでは安全に使用でき、署名 ID も不要です。.appはファイルではなくディレクトリバンドルなので、cp -Rが必要です。
ステップ 4:スクリプトを実行可能にする
chmod +x scripts/build-android.sh scripts/build-ios.sh
ステップ 5:.gitignore に builds/ を追加する
.gitignore に次の内容を追加します(すでに存在しないことを確認してください)。
# Local build artifacts
builds/
ステップ 6:使い方をユーザーに伝える
次の概要をユーザーに伝えてください。
Built two scripts for you:
./scripts/build-android.sh → builds/<slug>.apk
./scripts/build-ios.sh → builds/<scheme>.app
Install and run:
# Android (connected device or emulator)
adb install -r builds/<slug>.apk
adb shell am start -n <android.package>/.MainActivity
# iOS Simulator
xcrun simctl boot "iPhone 16" 2>/dev/null; open -a Simulator
xcrun simctl install booted builds/<scheme>.app
xcrun simctl launch booted <ios.bundleIdentifier>
メッセージを作成する際は、ステップ 1 で確認した実際の値に置き換え、ユーザーがそのままコピーして貼り付けられるようにしてください。
重要な注意事項
- Release ビルドを使用します。 Debug ビルドでは、"Development Servers" リストが表示されるランチャー画面である
expo-dev-clientが起動します。実際の UI を表示する場合は、Release が必要です。 - ここでは iOS ビルドはシミュレーター専用です。 デバイス向けビルドにはプロビジョニングプロファイルと署名 ID が必要ですが、このスキルの対象外です。ユーザーからデバイス向けビルドを求められた場合は、
eas buildまたは Xcode での手動アーカイブを案内してください。 - Android の署名にはデバッグキーのみを使用します。 APK はローカルテストや e2e には問題ありませんが、Play Store への申請には使用しないでください。本番環境では、リリース用キーストアを設定するか、
eas buildを使用してください。 - 値はプロジェクト固有です。 "YourApp" や Platano のサンプル値をハードコードしないでください。必ず
app.config.ts/app.jsonを読み取り、ディスク上のファイルと照合してください。
トラブルシューティング
"Build did not produce ..."
xcodebuild または gradlew コマンドは成功しましたが、アーティファクトがスクリプトの想定する場所にありません。通常、次のいずれかが原因です。
- スキーム名またはワークスペース名が間違っています(
ios/*.xcworkspaceとios/*.xcodeproj/xcshareddata/xcschemes/を確認してください) - ビルドスクリプトまたは Gradle のオーバーライドで、カスタムの
derivedDataPathまたは出力ディレクトリが設定されています
xcodebuild: error: The workspace ... does not exist
npx expo prebuild を実行して ios/ を再生成してください。すでに ios/ フォルダーがあるのにワークスペースがない場合は、CocoaPods のインストールに失敗した可能性があります。cd ios && pod install を実行してください。
APK をインストールできるが、expo-dev-client のランチャーが開く
スクリプトのどこかで assembleDebug が実行されました。ステップ 2 のスクリプトが assembleRelease を呼び出すことを確認してください。
.app を開くと "Development Servers" が表示される
iOS でも同じ問題です。スクリプトが Release ではなく -configuration Debug を指定してビルドされています。ステップ 3 のスクリプトを確認してください。
xcrun simctl install で "incorrect executable format" と表示される
ユーザーが macOS 上で .app を直接 open しようとしました。シミュレーター用の .app バンドルは xcrun simctl 内でのみ実行でき、macOS アプリケーションとしては実行できません。xcrun simctl install booted <path> コマンドを使用してください。