集酒 開発環境構築手順
作成 2026-09-17 JST / 対象: shushu-app(Expo SDK 54・React Native 0.81)と shushu-supabase(Supabase ローカル)
新しく参加したメンバーが、自分の Mac でローカルの Supabase にテストデータを入れ、iOS シミュレータでアプリにログインできるところまでを通しで書いています。クラウド(本番の Supabase・EAS・RevenueCat・ストア)には触らない手順です。
コマンドとファイル名は、各リポジトリの main(shushu-app fb01f41、shushu-supabase cf7d251)の中身と、既存メンバーの Mac で実際に動いている構成から書いています。新しいクローンからの npm ci・型チェック・lint の結果は末尾の「確認したこと」の表にあります。まっさらな Mac での通し(ツールのインストールから)はまだ誰も試していません。つまずいたら、その箇所とエラー文をそのまま共有してください。
01全体像
| リポジトリ | 中身 | ローカルで使うもの |
|---|---|---|
OkahashiKa/shushu-app | アプリ本体(Expo / React Native / TypeScript / Zustand) | Node.js 20・Xcode・CocoaPods |
OkahashiKa/shushu-supabase | DB マイグレーション・RLS・Storage・Edge Functions・図鑑マスタの seed・テストデータ投入スクリプト | Docker・Supabase CLI・Python 3・psql |
OkahashiKa/shushu-design | 要件定義・設計・実装計画(読むだけ) | — |
ローカルでは次の形で繋がります。
- Supabase CLI が Docker の中に DB・認証・Storage・API を立てる(API は
http://127.0.0.1:54321、DB は54322、管理画面 Studio は54323) - アプリは
.envに書いたローカルの URL と公開鍵で、その API を見る - アプリは MMKV・RevenueCat などネイティブのモジュールを使うため、Expo Go では動きません。開発用ビルド(
expo-dev-client入りの「shushu (Dev)」)を一度ビルドしてシミュレータに入れ、あとは Metro(JS の配信サーバー)から JS を読み込みます - 開発用ビルドの Bundle ID は
com.felisnow.shushu.dev(本番com.felisnow.shushuと並べて入れられる)。切り替えは環境変数APP_VARIANT=development
02アクセス権をもらう
3 つのリポジトリはすべて 非公開(private) です。オーナー(岡橋)に GitHub のユーザー名を伝えて、招待を受けてください。
| 何 | ローカル開発に要るか | 備考 |
|---|---|---|
| GitHub の 3 リポジトリ | 必須 | 招待メールから承認する |
| Apple Developer のチーム | iPhone 実機で動かすときだけ | シミュレータだけなら不要。プッシュ通知の確認はチームへの参加が必要 |
| Expo(EAS)のプロジェクト | 不要 | クラウドビルド(配布用)をするときだけ。ローカルのビルドは使わない |
| Supabase のクラウドプロジェクト | 不要 | 開発はローカルの DB で行う。クラウドへの反映はオーナーが行う |
| RevenueCat | 不要 | 鍵が無ければ課金の画面は自動で隠れる(src/services/purchases.ts) |
GitHub に HTTPS で入れるように、GitHub CLI でログインしておくと楽です(ツールは次の章で入れます)。
gh auth login
03ツールを入れる
前提は macOS(Apple Silicon)。右の列は、既存メンバーの Mac で 2026-09-17 に動いているバージョンです(--version で確認)。
| ツール | 用途 | 動作中のバージョン |
|---|---|---|
| Homebrew | 下のツールを入れる | — |
| Node.js 20 | アプリ(CI も Node 20) | v20.20.1 / npm 10.8.2 |
| Xcode | iOS のビルドとシミュレータ | Xcode 26.6 |
| CocoaPods | iOS のネイティブ依存 | — |
| Docker(Docker Desktop または Rancher Desktop) | Supabase ローカル | Docker 25.0.4(Rancher Desktop) |
| Supabase CLI | ローカルの起動・マイグレーション | 2.75.0 |
| psql(libpq) | DB のテストを流す | — |
| Python 3 | テストデータ投入・seed の生成(標準ライブラリだけ使う) | macOS 付属の python3 |
Homebrew
入っていなければ brew.sh のインストールコマンドを実行してください。
コマンドラインのツール
brew install git gh node@20 cocoapods supabase/tap/supabase libpq
node@20 と libpq は PATH に自動では入らないので、シェルの設定に足します。
echo 'export PATH="/opt/homebrew/opt/node@20/bin:/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
node@20 の代わりに、そのツールで Node 20 を入れて使ってください。リポジトリに .nvmrc は置いていません。
Xcode
- App Store から Xcode を入れて、一度起動する(追加コンポーネントのインストールと iOS シミュレータのランタイムの取得まで済ませる)
- コマンドラインツールの向き先を Xcode にする
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer sudo xcodebuild -license accept xcrun simctl list devices available | head
Docker
Docker Desktop か Rancher Desktop を入れて起動しておきます(Rancher Desktop はコンテナエンジンを dockerd (moby) にする)。
入ったかの確認
node -v # v20.x
npm -v
pod --version
supabase --version
docker info > /dev/null && echo "docker OK"
psql --version
python3 --version
xcodebuild -version04リポジトリを取得する
2 つのリポジトリを同じ親ディレクトリに並べて置きます(ソースコードのコメントが shushu-supabase/… のように相対で指しているため)。場所は自由です。
mkdir -p ~/dev/shushu && cd ~/dev/shushu
gh repo clone OkahashiKa/shushu-app
gh repo clone OkahashiKa/shushu-supabase
gh repo clone OkahashiKa/shushu-design # 設計を読むなら05Supabase をローカルで起動する
Docker が起動していることを確かめてから実行します。初回はイメージの取得で数分かかります。
cd ~/dev/shushu/shushu-supabase supabase start
続けて、マイグレーションをすべて流し直し、図鑑マスタ(supabase/seed.sql)を入れます。
supabase db reset
アプリを触れる状態にするため、テストアカウント・投稿・フォロー関係を入れます。何度流しても同じ状態に戻ります。
python3 scripts/seed-test-data.py
ログインに使うメールアドレスとパスワードは次で表示できます(ローカル DB 専用のアカウントです)。
python3 scripts/seed-test-data.py --accounts
| アカウント | 確かめられること |
|---|---|
tester@shushu.test | 主役。図鑑の記録・下書き・非公開投稿・飲んだ場所あり |
hanako@shushu.test / kenji@shushu.test | tester と相互フォロー。親しい友達限定の投稿 |
yuki@shushu.test | 飲んだ場所を他人に見せない設定 |
sora@shushu.test | 非公開アカウント。フォロー申請が承認待ち |
tsumugi@shushu.test | tester を片方向でフォロー |
newbie@shushu.test | 投稿もフォローも無い、空の状態 |
supabase db reset はテストアカウントも消します。reset のあとは python3 scripts/seed-test-data.py を流し直してください。
投入スクリプトは接続先が 127.0.0.1 / localhost でなければ何もせずに終了します。クラウドには流れません。
管理画面(Studio)は http://127.0.0.1:54323、送られたメールの確認画面は supabase status に出る Mailpit の URL で開けます。
06アプリの .env を作る
依存を入れて、ひな形から .env を作ります。.env は git に入りません。
cd ~/dev/shushu/shushu-app npm ci cp .env.example .env
ローカル Supabase の URL と公開鍵を確認します。
supabase status -o env --workdir ../shushu-supabase | grep -E '^(API_URL|PUBLISHABLE_KEY|ANON_KEY)='
.env を次のように書き換えます。鍵は上で出た PUBLISHABLE_KEY の値(sb_publishable_ で始まる。公開前提の鍵)を入れます。
EXPO_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321 EXPO_PUBLIC_SUPABASE_ANON_KEY=<PUBLISHABLE_KEY の値> EXPO_PUBLIC_APP_ENV=development EXPO_PUBLIC_ENABLE_OAUTH=false
| 変数 | 意味 | ローカル開発 |
|---|---|---|
EXPO_PUBLIC_SUPABASE_URL | Supabase の API の URL | 必須。無いと起動直後に Missing EXPO_PUBLIC_SUPABASE_URL… で落ちる |
EXPO_PUBLIC_SUPABASE_ANON_KEY | 公開鍵 | 必須 |
EXPO_PUBLIC_APP_ENV | 環境の印 | development |
EXPO_PUBLIC_ENABLE_OAUTH | Google / Apple ログインのボタンを出すか | false(メール/パスワードでログイン) |
EXPO_PUBLIC_REVENUECAT_IOS_KEY / …_ANDROID_KEY | 課金(応援プラン・チップ) | 書かない。無ければ課金の画面は隠れる。確認が必要になったらオーナーに相談 |
EXPO_PUBLIC_ENABLE_STORE_REVIEW | レビュー依頼の自動表示 | 書かない(既定で無効) |
EXPO_PUBLIC_SITE_URL | 利用規約・プライバシーポリシーのページ | 書かない(既定 https://shushu-site.pages.dev) |
supabase status には SERVICE_ROLE_KEY・SECRET_KEY・JWT_SECRET も出ますが、アプリの .env には絶対に入れないでください。EXPO_PUBLIC_ で始まる変数はアプリの中に文字列として埋め込まれ、誰でも取り出せます。
07iOS シミュレータで動かす
初回: 開発用ビルドを作って入れる
ios/ ディレクトリは git に入っていません。次のコマンドが app.config.js から ios/ を生成し(prebuild)、CocoaPods を入れ、ビルドしてシミュレータに入れ、Metro を起動します。初回は 10 分以上かかります。
APP_VARIANT=development npx expo run:ios
使うシミュレータを選びたいときは --device を付けると一覧から選べます。
APP_VARIANT=development npx expo run:ios --device
APP_VARIANT=development を必ず付ける
付け忘れると本番の Bundle ID(com.felisnow.shushu)・アプリ名「shushu」で ios/ が生成されます。やり直すときは ios/ を消してから付けて実行し直してください(rm -rf ios)。
シミュレータに「shushu (Dev)」が立ち上がったら、tester@shushu.test と --accounts で出たパスワードでログインします。ホームに投稿が並び、図鑑に記録済みの銘柄があれば成功です。
2 回目以降: JS だけの変更
アプリはシミュレータに入ったままなので、Metro を起動してアプリを開くだけです。
npx expo start --dev-client
Metro の画面で i を押すとシミュレータでアプリが開きます。ファイルを保存すると画面に反映されます。
ビルドし直しが要るとき
package.jsonにネイティブのモジュールが増えた・変わったapp.config.js(権限の文言・プラグイン・Bundle ID など)が変わった
git pull npm ci APP_VARIANT=development npx expo run:ios
.env を変えたときは、Metro をキャッシュを消して起動し直します。
npx expo start --dev-client --clear
08iPhone 実機で動かす(任意)
シミュレータで足りない確認(カメラ・位置情報・触ったときの感触・プッシュ通知)をするときだけです。
1. Mac の LAN の IP を .env に入れる
iPhone から見た 127.0.0.1 は iPhone 自身なので、Mac のローカル Supabase に届きません。Mac と iPhone を同じ Wi-Fi に繋ぎ、Mac の IP を調べて .env の URL を書き換えます(シミュレータもこの IP のまま動きます)。
ipconfig getifaddr en0
EXPO_PUBLIC_SUPABASE_URL=http://<上で出た IP>:54321
Wi-Fi の割り当てが変わると繋がらなくなります。そのときは IP を取り直して書き換え、Metro を --clear で起動し直してください。
2. 署名のチームを設定してビルドする
- iPhone を USB で Mac に繋ぎ、iPhone の「設定 → プライバシーとセキュリティ → デベロッパモード」をオンにする
- Xcode の Settings → Accounts に自分の Apple ID を追加する(実機への署名に使う)
- 次のコマンドで実機を選んでビルドする。署名のチームを聞かれたら、参加している Apple Developer のチームを選ぶ
APP_VARIANT=development npx expo run:ios --device
初回起動時に「ローカルネットワーク上のデバイスの検索と接続」の許可を求められたら許可してください。許可しないと、エラーを出さずに接続が失敗します。
プッシュ通知を確かめるとき
開発用ビルドは、既定でプッシュ通知の権限(aps-environment)を外してあります。Apple Developer Program に加入していない個人チームの署名では、この権限があるとビルドが署名で落ちるためです(app.config.js)。Apple Developer のチームに参加していて通知を確かめるときだけ、次のように付けてビルドします。
APP_VARIANT=development IOS_PUSH_ENABLED=1 npx expo run:ios --device
09Android(任意・未検証)
アプリは Android にも対応していますが、既存メンバーの Mac には Android SDK が入っておらず、この手順でのローカル実行は確認していません。試す場合の入口だけ書きます。
- Android Studio を入れ、SDK と Android エミュレータ(AVD)を 1 台作る
- Android Studio 付属の JDK を使うよう
JAVA_HOMEとANDROID_HOMEを設定する - エミュレータから見た Mac は
10.0.2.2なので、.envの URL をhttp://10.0.2.2:54321か、Mac の LAN の IP にする
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" export ANDROID_HOME="$HOME/Library/Android/sdk" export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH"
APP_VARIANT=development npx expo run:android
動いた・つまずいた結果は共有してください。この章を書き直します。
10コミット前の確認
GitHub Actions(CI)と同じ確認を手元で流せます。
アプリ(shushu-app)
npx tsc --noEmit npx expo lint --max-warnings 0 npx --yes expo-doctor@latest
バックエンド(shushu-supabase)
マイグレーションを足した・変えたときは、0 から流し直して通ることを確かめます。
supabase db reset supabase db lint python3 scripts/gen-seed.py --check
DB のテスト(SQL)は、ローカル DB に向けて流します。どれもトランザクションの中で作って ROLLBACK で終わるので、DB に何も残りません。合格の値は各ファイルの先頭のコメントにあります。
for f in supabase/tests/[!_]*.sql; do echo "== $f" PGPASSWORD=postgres psql -h 127.0.0.1 -p 54322 -U postgres -d postgres -v ON_ERROR_STOP=1 -Atqf "$f" || break done
変更するときの決まり
- 図鑑マスタは
supabase/seed-data/*.jsonが正本。JSON を直したらpython3 scripts/gen-seed.pyでseed.sqlを作り直して一緒にコミットする(CI が一致を確かめる) - 投稿の味のチップ・属性チップの許す値は、DB の CHECK とアプリの
src/constants/tags.tsを同じ並びにする。片方だけ増やすと投稿が DB で弾かれる - 行動分析のイベント名・プロパティは、DB の台帳(
analytics.event_types)とアプリのsrc/constants/analytics.tsを同じコミットで変える - 詳しい設計は
shushu-supabase/README.mdとshushu-designリポジトリ
11毎日の起動と停止
始めるとき
cd ~/dev/shushu/shushu-supabase && supabase start cd ~/dev/shushu/shushu-app && npx expo start --dev-client
終わるとき
Metro は Ctrl+C で止めます。ターミナルを閉じるだけだと Metro が裏に残り、CPU を使い続けて Mac が熱くなることがあります(既存メンバーの Mac で、誰も見ていない Metro が 12 時間近く動き続けていた実例あり)。
cd ~/dev/shushu/shushu-supabase && supabase stop
裏に Metro が残っていないかの確認:
pgrep -fl "expo start"
他の人の変更を取り込むとき
cd ~/dev/shushu/shushu-supabase && git pull && supabase db reset && python3 scripts/seed-test-data.py cd ~/dev/shushu/shushu-app && git pull && npm ci
shushu-app の package.json や app.config.js が変わっていたら、開発用ビルドを作り直してください。
12困ったとき
| 症状 | 原因と対処 |
|---|---|
起動直後に Missing EXPO_PUBLIC_SUPABASE_URL or EXPO_PUBLIC_SUPABASE_ANON_KEY | .env が無い・変数名の書き間違い。.env の章を見直し、npx expo start --dev-client --clear |
| ログインで失敗する・投稿が出ない | Supabase が止まっている(supabase status)、または db reset のあとテストデータを入れていない(python3 scripts/seed-test-data.py) |
| 実機だけ繋がらない(シミュレータは動く) | .env の URL が 127.0.0.1 のまま/Wi-Fi が別/IP が変わった/ローカルネットワークの許可を拒否した(iPhone の「設定 → shushu (Dev) → ローカルネットワーク」をオン) |
supabase start が Docker の接続で失敗する | Docker Desktop / Rancher Desktop が起動していない。起動して docker info が通ってから再実行 |
supabase start がポートの使用中で失敗する | 別の Supabase プロジェクトが 54321〜54323 を使っている。そちらを supabase stop で止める |
| Expo Go で開いたら赤い画面になる | このアプリは Expo Go では動きません。開発用ビルドを使う |
| 実機ビルドが署名(Signing)で失敗する | Xcode に Apple ID を追加していない/チームを選んでいない。プッシュ通知の権限が原因なら IOS_PUSH_ENABLED=1 を外す |
pod install 関連で失敗する | rm -rf ios してから APP_VARIANT=development npx expo run:ios をやり直す |
| Mac が熱い・ファンが回り続ける | 裏に残った Metro。pgrep -fl "expo start" で確かめて止める |
13確認したこと
| 項目 | 結果 | いつ・どこで |
|---|---|---|
| 3 リポジトリが非公開であること | 3 つとも PRIVATE(gh repo view) | 2026-09-17、GitHub |
| ツールのバージョン | ツールの表の右の列 | 2026-09-17、既存メンバーの Mac |
supabase status -o env に API_URL・PUBLISHABLE_KEY・ANON_KEY が出ること | 出る(値はこの文書に書いていない) | 2026-09-17、既存メンバーの Mac |
新しいクローン(shushu-app fb01f41)で npm ci | 成功(964 パッケージ、約 6 秒。glob@7 の非推奨の警告が 1 件出るが無害) | 2026-09-17 21:04、既存メンバーの Mac |
同じクローンで npx tsc --noEmit / npx expo lint --max-warnings 0 | どちらも終了コード 0 | 2026-09-17 21:04〜21:06、同上 |
新しいクローン(shushu-supabase cf7d251)で python3 scripts/gen-seed.py --check | 終了コード 0(「iwase は姿が 0 本」の注意が出るが想定どおり) | 2026-09-17 21:06、同上 |
| コミット前の確認の章の DB テストのループ | 7 ファイルすべて失敗なし(すでに起動していたローカル DB に対して。db reset からは流していない) | 2026-09-17 21:06、同上 |
npx expo run:ios で新しいクローンから開発用ビルドを作ること | 未確認(既存の作業ディレクトリでは動いている) | — |
| まっさらな Mac でツールのインストールから通すこと | 未確認 | — |
| Android のローカル実行 | 未確認(Android SDK の入った Mac が無い) | — |