🐶
blog.terrier.dev

posted: 2020/07/25

Expoでflavorっぽいことをする


このドキュメントはすでに古くなっています。
app.config.jsによってdynamic conifgがすでに可能です
https://docs.expo.io/workflow/configuration/#dynamic-configuration-with-appconfigjs



stagingのときに別bundleIdentifierにしたりアイコンにstaging帯つけたいなーみたいな事がある。(例えばこういうことがやりたいときとか)
flavorとか言うのが近いやつ。ざっくりだけど簡易なスクリプトで解決した

方針

  • app.jsonを書き換えればflaveorっぽいことが出来そう
  • やり方として、flavoer部分をオーバーライドするように差分を書いておく
  • deepmergeしてstaging用のapp.jsonを生成する
  • ↑このコードをbuild前に発火するように prebuildとして仕込む

コード

app-staging-override.json
例えばbundlerIdを変更したいならこんなの
{
  "expo": {
    "slug":"my-application-staging"
      "ios": {
	"bundleIdentifier": "com.foo.baz.staging"
      }
    }
  }
}
bin/generate-staging-app-json.js はこんな具合にjsonをmergeしてstdoutするだけ。fileでセーブするとこまでやっても良いけど今回はパイプで処理することにした
const merge = require("deepmerge")
const baseAppJson = require("../app.json")
const override = require("../app-staging-override.json")
const merged = merge.all([baseAppJson, override])
console.log(JSON.stringify(merged, null, 2))
package.jsonはこんな具合
"scripts:"{
  "build:ios:production": "expo build:ios --type archive --release-channel=YOUR_PRODUCTION_CHANNEL"
  // ↓stagingのときはprebuildをかける
  "prebuild:ios:staging": "node bin/generate-staging-app-json.js > app.staging.generated.json",
  "build:ios:staging": "expo build:ios --config app.staging.generated.json --type archive --release-channel=YOUR_STAGING_CHANNEL "
}

Edit on Github
@terrierscript