もともと、expoのapp.jsonですが、場合によってはdevとproductで分けたい場合があります。
ぺペロミアだと以下のiosのGoogleSiginに使用するreservedClientIdと
■ app.json
"ios": { "config": { "googleSignIn": { "reservedClientId": "***************" } } },
devとproductで分けて収集しているsentryAuthTokenが該当します
■ app.json
"hooks": { "postPublish": [ { "file": "sentry-expo/upload-sourcemaps", "config": { "organization": "freelance-km", "project": "peperomia", "authToken": "********************" } } ] }
今までは、以下の4つを管理して、適時app.jsonに上書きするようにコマンドを仕込んでいましたが、
$ls -al app.json ←実行時に使用 app.development.json ←開発時に使用 app.product.json ←本番ビルド時に使用 app.template.json ←ローカルお試し用
これだとexpoのバージョンアップやリリースのbuildNumberなど全ファイル更新しなきゃで面倒くさかったので、jqのテンプレートエンジンで統一化するようにしました。
テンプレートエンジンの機能的は、ここ参照
Cookbook · stedolan/jq Wiki · GitHub
まず、install
$ brew install jq
まず、configの下に設定ファイルを置く
■config/development.json
{ "iosGoogleSignInClientId": "aaa", "sentryAuthToken": "bbb" }
jqのコマンドで特定の値を取得する
$ jq '.iosGoogleSignInClientId' config/product.json "aaa"
まずテンプレートとしてjqファイル作成 ■ appBase.jq
{ "expo": { "name": "ペペロミア", ....(略) "ios": { "supportsTablet": true, "buildNumber": "10", "bundleIdentifier": "com.wheatandcat.peperomia", "infoPlist": { "NSPhotoLibraryUsageDescription": "予定作成のために使用します。", "NSCameraUsageDescription": "予定作成のためにカメラを使用します。", "CFBundleDevelopmentRegion": "ja_JP" }, "config": { "googleSignIn": { "reservedClientId": $iosGoogleSignInClientId } } }, ....(略) "hooks": { "postPublish": [ { "file": "sentry-expo/upload-sourcemaps", "config": { "organization": "freelance-km", "project": "peperomia", "authToken": $sentryAuthToken } } ] } }
いろいろ頑張れば、1コマンドでいけそうだけど シェルスクリプトにまとめ、こんな感じ
■createDevelopmentAppjson.sh
#!/bin/sh iosGoogleSignInClientId=`jq '.iosGoogleSignInClientId' config/development.json` sentryAuthToken=`jq '.sentryAuthToken' config/development.json` # ダブルコーテーションを除外 iosGoogleSignInClientId=${iosGoogleSignInClientId:1} iosGoogleSignInClientId=${iosGoogleSignInClientId%\"} sentryAuthToken=${sentryAuthToken:1} sentryAuthToken=${sentryAuthToken%\"} #echo ${iosGoogleSignInClientId} #echo $sentryAuthToken jq -n --arg iosGoogleSignInClientId $iosGoogleSignInClientId --arg sentryAuthToken $sentryAuthToken -f appBase.jq | tee app.json
ダブルコーテーションを除外しないとエスケープされてしまったので処理追加。 これでapp.jsonの値を変更する場合はappBase.jqを変更するだけになった。