Firebase の functions や hosting を書いて毎回デプロイして動作を確かめるのは大変です。
Firebase には Local Emulator があり、すぐにローカルでコードの動作を確かめることができます。
コードとしてレポジトリに含めたくない情報は config として環境変数のような形で実行時に読み込むようにするのですが、Local Emulator ではハマりどころがあったので共有します。
通常の config 設定
アプリ名を your-application-name
だとすると、以下のように key value を設定します。
$ firebase functions:config:set your-application-name.key=dummykeystring
Local Emulator では読み込めない
上記のように config:set した設定は下記のようにシェルコマンドからは呼び出せました。
$ firebase functions:config:get
{
"your-application-name": {
"key": "aaaaaaaaaasadfffffffffffffffreewfdsdsf"
}
}
しかし以下のようなコードにおいて、 Local Emulator 上では呼び出せませんでした(確か undefined だったと思います)。
一方でデプロイした先のFunctionsからは値を取得することができました。
import * as functions from 'firebase-functions';
export const showTrigger = functions.https.onRequest((request, response) => {
const apiKey = functions.config()['your-application-name'].key;
console.log('apiKey') // undefined
});
Local Emulator でも読み込めるようにする
以下のようにして .runtimeconfig.json に同様のものを入れておくとうまくいきました。
$ cd functions/
$ firebase functions:config:get > .runtimeconfig.json
ただし、このjsonファイルがGitHub上などに上がってしまうと問題があるので、gitを使っている場合には .gitignore などに該当ファイルを入れるのを忘れないようにしましょう。
参考
公式: https://firebase.google.com/docs/functions/local-emulator#serve_http_functions_from_the_command_line
ググって引っかかった記事: https://stackoverflow.com/questions/54689871/set-firebase-local-emulator-cloud-function-environment-config-values
言い訳
公式ドキュメントにもちゃんと書いてあるのに微妙にハマりました。
関数を設定する(省略可)
省略可
と書いてあったので最初のデプロイをして動くまではセクションごと無視していたのでした。
カスタム関数の構成変数を使用している場合は、最初にローカル環境でカスタムの構成を取得するコマンドを実行します(functions ディレクトリ内で実行します)。
この設定できる変数は 構成変数
と呼んでいるようです。普段ランタイムだけで使う変数は 環境変数
みたいな呼び方をすることが多いので最初ざっと読んでいる時には気がつかなかったのでした。