たかぎとねこの忘備録

プログラミングに関する忘備録を自分用に残しときます。マサカリ怖い。

一つの端末に複数環境用にビルドされたapkをインストールする話

ひとつの端末に本番環境、ステージング環境、開発環境用のそれぞれの環境でビルドされたアプリをインストールするためには、動的にapp.config.jsios.bundleIdentifierフィールドとandroid.packageフィールドを変更する必要がある。

そのために環境変数APP_VARIANTを今回は使用する。

APP_VARIANTdevelopmentの場合は開発環境を表、previewの場合はステージング環境、何も設定されていない場合は本番環境を表すようにする。

この値を変更するためにeas.jsonenvフィールドを利用する。

各ビルド用のプロファイルにenv.APP_VARIANTフィールドを用意してそれぞれの値を準備する。

// eas.json
{
  "build": {
    "development": {
      "developmentClient": true,
      "env": {
        "APP_VARIANT": "development",
      }
    },
    "preview": {
      "extends": "production",
      "env": {
        "APP_VARIANT": "preview"
      }
    },
    "production": {}
  }
}

次に、app.config.jsを作成する今回はすでにapp.jsonファイルが事前に作成されていることを前提とする。

app.jsonとapp.config.jsを併用することで、最初にapp.jsonが読み込まれた後、正規化された内容がapp.config.jsでexport defaultされた関数に渡されます。それを使用することで既存の設定内容を活かしながら、動的にせって内容を変更することが可能になります。

// app.config.js

const IS_DEV = process.env.APP_VARIANT === "development";
const IS_STAGING = process.env.APP_VARIANT === "preview";

function getAppIds() {
  let iOSBundleIdentifier = "com.company.myapp";
  let androidPackage = "com.company.myapp";
  if (process.env.APP_VARIANT === "development") {
    iOSBundleIdentifier = "com.company.myapp.dev";
    androidPackage = "com.company.myapp.dev";
  }
  if (process.env.APP_VARIANT === "preview") {
    iOSBundleIdentifier = "com.company.myapp.staging";
    androidPackage = "com.company.myapp.staging";
  }
  return {
    iOSBundleIdentifier,
    androidPackage,
  };
}

export default ({ config }) => {
  const { iosBundleIdentifier, androidPackage } = getAppIds();

  return {
    ...config,
    ios: {
      ...config.ios,
      bundleIdentifier: iosBundleIdentifier,
    },
    android: {
      ...config.android,
      package: androidPackage,
    },
  };
};

この設定によって、eas build --platform android --profile previewを実行した場合は、環境変数APP_VARIANTpreviewが設定されるのでandroid.packageの値がcom.company.myapp.stagingに更新された上でビルドされる。