mcpField
L
local-build

local-build

github.com/code-with-beto開発144240 回インストール15 週間前に更新
リポジトリ

local-build について

Expo と React Native のプロジェクト向けに、Android APK と iOS シミュレーター用 .app を生成するローカルリリースビルドスクリプトを作成するスキルです。プロジェクト設定から識別情報を読み取り、プラットフォームのツールチェーンを使って、ローカルテストや E2E 用の成果物を固定パスに出力します。

主な機能

  1. 01Android リリース APK 用スクリプトの生成
  2. 02iOS シミュレーター .app 用スクリプトの生成
  3. 03Expo 設定からアプリ識別情報を取得
  4. 04固定パスでビルド成果物を置き換え
  5. 05ビルド成果物ディレクトリを .gitignore に追加

活用シーン

  1. 01Android 端末テスト用 APK のビルド
  2. 02E2E テスト用 iOS シミュレータービルドの作成
  3. 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 プロジェクトであることを確認します。

  1. dependencies に expo が含まれる package.json があることを確認します。
  2. app.json または app.config.ts / app.config.js があることを確認します。

どちらも見つからない場合は作業を中止し、このスキルは Expo プロジェクト内でのみ動作することをユーザーに伝えてください。

ステップ 1:Expo 設定からアプリの識別情報を読み取る

スクリプトには、ユーザーのプロジェクトに固有の 3 つの値が必要です。「YourApp」をハードコードしたり、名前を決めつけたりしないでください。 設定から値を読み取ります。

抽出する値
値確認する場所用途
nameapp.config.ts / app.config.js / app.json → expo.nameiOS のスキームと .app のファイル名
slugexpo.slugAPK のファイル名(フォールバック:name を小文字にした値)
ios.bundleIdentifierexpo.ios.bundleIdentifierxcrun simctl launch コマンド
android.packageexpo.android.packageadb 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> コマンドを使用してください。

コメント