本番、ステージング、開発環境などで設定を切り替えたいシーンは多くあると思います。
Expoでアプリを作るときはrelease-channel
を使っていたのですが、Webのときはどうすればいいのかな?と思い調べてみました。
Expo、特にExpo webを使ったときに、以下のようにして設定を切り替えました。
app.config.jsを使う
Expoの設定周りは通常app.json
を使うと思います。
実はそれをapp.config.js
というファイルでさらに拡張できます。
app.config.js
はJSのファイルなので、内部で環境変数process.env
を使えるのが特徴です。
今回はこれを利用します。
実装
ルートディレクトリにapp.config.js
を作ります。
環境変数process.env.MY_CUSTOM_ENV
によって、本番/開発のapiKey
を切り替えています。
export default ({ config }) => {
const apiKey =
process.env.MY_CUSTOM_ENV === "production"
? "prod-api-key-xxxxxx"
: "dev-api-key-oooooo";
return {
...config,
extra: {
apiKey,
},
};
};
使う側の例です。
Constants.manifest.extra.apiKey
で取得できます。
import Constants from "expo-constants";
console.log(Constants.manifest.extra.apiKey);
切り替えの方法
例えばwebビルドの場合、以下のように環境変数を指定してexpoコマンドを叩くことで、先程のapp.config.js
の切り替えが有効になります。
# production用のAPI KEYを使うとき
MY_CUSTOM_ENV=production expo build:web
# 何も指定しなければdev用
expo build:web
同様に各種expoコマンドで切り替えが使えます。
# 開発サーバー起動
MY_CUSTOM_ENV=production expo start
# iosのリリースビルド
MY_CUSTOM_ENV=production expo build:ios
補足: release-channel
アプリの環境切り替えはrelease-channelを使うときが多いと思います。
例えば expo publish --release-channel production
で本番にpublishするなど。
release-channelによる切り替えも考慮して、以下のようにしておくとより便利かもしれません。
export default ({ config }) => {
const apiKey =
process.env.MY_CUSTOM_ENV === "production"
|| Constants.manifest.releaseChannel === "production"
? "prod-api-key-xxxxxx"
: "dev-api-key-oooooo";
return {
...config,
extra: {
apiKey,
},
};
};