😎

EAS Build環境でaws-exports.jsを動的に書き出す

2022/01/31に公開

ExpoAmplify Libraries を組み込んだReact Nativeアプリを作り、EAS Build でビルドしようとするとエラーが発生する。

> Task :app:bundleReleaseJsAndAssets
warning: the transform cache was reset.
                    Welcome to Metro!
              Fast - Scalable - Integrated
[stderr] error Unable to resolve module ./src/aws-exports from /root/workingdir/build/App.js:
[stderr] None of these files exist:
[stderr]   * src/aws-exports(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)
[stderr]   * src/aws-exports/index(.native|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx|.android.js|.native.js|.js|.android.jsx|.native.jsx|.jsx|.android.json|.native.json|.json)

aws-exports.js は .gitignore に含まれるため EAS Build環境にチェックアウトされなくてビルドに存在しない。

これを eas secret で環境変数にaws-exports.js をセットしておき、ビルド時に書き出して解決する。

eas secret:create --name=AWS_EXPORTS_JSON_BASE64 --value=$(base64 -i ./src/aws-exports.js)

base64エンコードするのは改行コード付きの文字列を環境で変数でうまく取り扱うための先人の知恵っぽくて、インフラ関連のツールでよく見る。

これをビルド環境でデコードしてファイルに書き出す。package.jsonにビルド事前hookの eas-build-pre-install を定義する。

"scripts": {
    "eas-build-pre-install": "echo $AWS_EXPORTS_JSON_BASE64 | base64 -d > ./src/aws-exports.js",
    ...
  },

base64コマンドはmacOS環境で使えるものとLinuxのGNU coreutils版で微妙に違ってEAS環境では base64 -o ./src/aws-exports.js などのオプションは使えない。

Amplifyプロジェクトの構成を更新したらsecretの値も上書きしてやる

eas secret:create --name=AWS_EXPORTS_JSON_BASE64 --value=$(base64 -i ./src/aws-exports.js) --force

Discussion