shushu / 開発者向け手順書

集酒 開発環境構築手順

作成 2026-09-17 JST / 対象: shushu-app(Expo SDK 54・React Native 0.81)と shushu-supabase(Supabase ローカル)

新しく参加したメンバーが、自分の Mac でローカルの Supabase にテストデータを入れ、iOS シミュレータでアプリにログインできるところまでを通しで書いています。クラウド(本番の Supabase・EAS・RevenueCat・ストア)には触らない手順です。

この手順書で確かめた範囲(2026-09-17 時点)

コマンドとファイル名は、各リポジトリの 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-supabaseDB マイグレーション・RLS・Storage・Edge Functions・図鑑マスタの seed・テストデータ投入スクリプトDocker・Supabase CLI・Python 3・psql
OkahashiKa/shushu-design要件定義・設計・実装計画(読むだけ)—

ローカルでは次の形で繋がります。

02アクセス権をもらう

3 つのリポジトリはすべて 非公開(private) です。オーナー(岡橋)に GitHub のユーザー名を伝えて、招待を受けてください。

何ローカル開発に要るか備考
GitHub の 3 リポジトリ必須招待メールから承認する
Apple Developer のチームiPhone 実機で動かすときだけシミュレータだけなら不要。プッシュ通知の確認はチームへの参加が必要
Expo(EAS)のプロジェクト不要クラウドビルド(配布用)をするときだけ。ローカルのビルドは使わない
Supabase のクラウドプロジェクト不要開発はローカルの DB で行う。クラウドへの反映はオーナーが行う
RevenueCat不要鍵が無ければ課金の画面は自動で隠れる(src/services/purchases.ts)

GitHub に HTTPS で入れるように、GitHub CLI でログインしておくと楽です(ツールは次の章で入れます)。

terminal
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
XcodeiOS のビルドとシミュレータXcode 26.6
CocoaPodsiOS のネイティブ依存—
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 のインストールコマンドを実行してください。

コマンドラインのツール

terminal
brew install git gh node@20 cocoapods supabase/tap/supabase libpq

node@20 と libpq は PATH に自動では入らないので、シェルの設定に足します。

terminal(zsh)
echo 'export PATH="/opt/homebrew/opt/node@20/bin:/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
nvm / Volta / mise などで Node を管理している場合

node@20 の代わりに、そのツールで Node 20 を入れて使ってください。リポジトリに .nvmrc は置いていません。

Xcode

  1. App Store から Xcode を入れて、一度起動する(追加コンポーネントのインストールと iOS シミュレータのランタイムの取得まで済ませる)
  2. コマンドラインツールの向き先を Xcode にする
terminal
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) にする)。

入ったかの確認

terminal
node -v            # v20.x
npm -v
pod --version
supabase --version
docker info > /dev/null && echo "docker OK"
psql --version
python3 --version
xcodebuild -version

04リポジトリを取得する

2 つのリポジトリを同じ親ディレクトリに並べて置きます(ソースコードのコメントが shushu-supabase/… のように相対で指しているため)。場所は自由です。

terminal
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 が起動していることを確かめてから実行します。初回はイメージの取得で数分かかります。

terminal
cd ~/dev/shushu/shushu-supabase
supabase start

続けて、マイグレーションをすべて流し直し、図鑑マスタ(supabase/seed.sql)を入れます。

terminal
supabase db reset

アプリを触れる状態にするため、テストアカウント・投稿・フォロー関係を入れます。何度流しても同じ状態に戻ります。

terminal
python3 scripts/seed-test-data.py

ログインに使うメールアドレスとパスワードは次で表示できます(ローカル DB 専用のアカウントです)。

terminal
python3 scripts/seed-test-data.py --accounts
アカウント確かめられること
tester@shushu.test主役。図鑑の記録・下書き・非公開投稿・飲んだ場所あり
hanako@shushu.test / kenji@shushu.testtester と相互フォロー。親しい友達限定の投稿
yuki@shushu.test飲んだ場所を他人に見せない設定
sora@shushu.test非公開アカウント。フォロー申請が承認待ち
tsumugi@shushu.testtester を片方向でフォロー
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 に入りません。

terminal
cd ~/dev/shushu/shushu-app
npm ci
cp .env.example .env

ローカル Supabase の URL と公開鍵を確認します。

terminal
supabase status -o env --workdir ../shushu-supabase | grep -E '^(API_URL|PUBLISHABLE_KEY|ANON_KEY)='

.env を次のように書き換えます。鍵は上で出た PUBLISHABLE_KEY の値(sb_publishable_ で始まる。公開前提の鍵)を入れます。

.env(シミュレータで動かす場合)
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_URLSupabase の API の URL必須。無いと起動直後に Missing EXPO_PUBLIC_SUPABASE_URL… で落ちる
EXPO_PUBLIC_SUPABASE_ANON_KEY公開鍵必須
EXPO_PUBLIC_APP_ENV環境の印development
EXPO_PUBLIC_ENABLE_OAUTHGoogle / 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 分以上かかります。

terminal(shushu-app)
APP_VARIANT=development npx expo run:ios

使うシミュレータを選びたいときは --device を付けると一覧から選べます。

terminal(shushu-app)
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 を起動してアプリを開くだけです。

terminal(shushu-app)
npx expo start --dev-client

Metro の画面で i を押すとシミュレータでアプリが開きます。ファイルを保存すると画面に反映されます。

ビルドし直しが要るとき

terminal(shushu-app)
git pull
npm ci
APP_VARIANT=development npx expo run:ios

.env を変えたときは、Metro をキャッシュを消して起動し直します。

terminal(shushu-app)
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 のまま動きます)。

terminal
ipconfig getifaddr en0
.env
EXPO_PUBLIC_SUPABASE_URL=http://<上で出た IP>:54321

Wi-Fi の割り当てが変わると繋がらなくなります。そのときは IP を取り直して書き換え、Metro を --clear で起動し直してください。

2. 署名のチームを設定してビルドする

  1. iPhone を USB で Mac に繋ぎ、iPhone の「設定 → プライバシーとセキュリティ → デベロッパモード」をオンにする
  2. Xcode の Settings → Accounts に自分の Apple ID を追加する(実機への署名に使う)
  3. 次のコマンドで実機を選んでビルドする。署名のチームを聞かれたら、参加している Apple Developer のチームを選ぶ
terminal(shushu-app)
APP_VARIANT=development npx expo run:ios --device

初回起動時に「ローカルネットワーク上のデバイスの検索と接続」の許可を求められたら許可してください。許可しないと、エラーを出さずに接続が失敗します。

プッシュ通知を確かめるとき

開発用ビルドは、既定でプッシュ通知の権限(aps-environment)を外してあります。Apple Developer Program に加入していない個人チームの署名では、この権限があるとビルドが署名で落ちるためです(app.config.js)。Apple Developer のチームに参加していて通知を確かめるときだけ、次のように付けてビルドします。

terminal(shushu-app)
APP_VARIANT=development IOS_PUSH_ENABLED=1 npx expo run:ios --device

09Android(任意・未検証)

アプリは Android にも対応していますが、既存メンバーの Mac には Android SDK が入っておらず、この手順でのローカル実行は確認していません。試す場合の入口だけ書きます。

  1. Android Studio を入れ、SDK と Android エミュレータ(AVD)を 1 台作る
  2. Android Studio 付属の JDK を使うよう JAVA_HOME と ANDROID_HOME を設定する
  3. エミュレータから見た Mac は 10.0.2.2 なので、.env の URL を http://10.0.2.2:54321 か、Mac の LAN の IP にする
terminal(zsh)
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"
terminal(shushu-app)
APP_VARIANT=development npx expo run:android

動いた・つまずいた結果は共有してください。この章を書き直します。

10コミット前の確認

GitHub Actions(CI)と同じ確認を手元で流せます。

アプリ(shushu-app)

terminal(shushu-app)
npx tsc --noEmit
npx expo lint --max-warnings 0
npx --yes expo-doctor@latest

バックエンド(shushu-supabase)

マイグレーションを足した・変えたときは、0 から流し直して通ることを確かめます。

terminal(shushu-supabase)
supabase db reset
supabase db lint
python3 scripts/gen-seed.py --check

DB のテスト(SQL)は、ローカル DB に向けて流します。どれもトランザクションの中で作って ROLLBACK で終わるので、DB に何も残りません。合格の値は各ファイルの先頭のコメントにあります。

terminal(shushu-supabase)
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

変更するときの決まり

11毎日の起動と停止

始めるとき

terminal
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 時間近く動き続けていた実例あり)。

terminal
cd ~/dev/shushu/shushu-supabase && supabase stop

裏に Metro が残っていないかの確認:

terminal
pgrep -fl "expo start"

他の人の変更を取り込むとき

terminal
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どちらも終了コード 02026-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 が無い)—