この記事は、「個人開発サービスに用いられている技術 Advent Calendar 2018」17日目の記事です。
現在、個人開発で3プラットフォーム対応アプリを作っているが、バックエンドをFirebaseにしていわゆるサーバーレスで開発を進めている。
FirebaseのCloud Functionsを使うにあたって、毎回Firebase上にデプロイしてテストするのは時間がかかって面倒なので、Cloud Functionsをローカルで実行する方法と、はまった点をまとめる。
下記の3つの方法がある。
今回はhttp系以外のローカル実行を行いたいのでCloud Functionsシェルを使う。
プロジェクトディレクトリにて下記を実行。
$ npm install --save firebase-functions@latest
$ npm install -g firebase-tools
これで functions/ が生成されるはず。
TypeScriptでCloud Functionsの処理を記述する場合、Cloud Functionsのテストやデプロイ前に下記のようなトランスパイルが必要(デプロイ時は自動で行ってくれるが)。
$ cd /project directory/functions/
$ npm run build
毎回この処理を行うのは面倒なので自動でトランスパイル処理が走るように設定しておく。
2つの方法があるのでお好みで。
$ cd /project directory/functions/
$ ./node_modules/.bin/tsc --watch
上記を実行しておけば自動トランスパイルされるようになる。
Command + Shift + B でwatchのビルドタスクを下記のように選択し、
するとターミナルが下記のようになる。
これで自動トランスパイルされるようになる。
この状態のまま、赤枠部分をクリックして、いつものターミナルに切り替えて作業を進める。
$ cd /project directory/functions/
$ firebase experimental:functions:shell
これで対話式でCloud Functionsの関数を呼び出すことができる。
どのように実行するかは、公式や他のブログにもまとめられているので、注意点を記す。
Cloud Funcitonsをローカルで実行しても、Firestoreへの処理はFirebase上の本番データに対して行われる(回避する方法あるかも)。
なので、存在しないFirestoreのドキュメントに対して処理を行おうとすると下記のようなエラーがでる。
No document to update:
Cloud Functionsシェルにはドキュメント名のワイルドカードをシミュレートするための paramsオプションが用意されている。
# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})
Cloud Functionsシェルは5001番ポートで動くが、もし他のプロセスがそこで走っている場合、シェル起動時に下記のエラーがでて動作がおかしくなる。
error: restPort (5001) is already in use
この場合は思い切って5001番を占有しているプロセスを強制終了させる。
$ sudo lsof -i tcp:5001
でプロセスIDを取得し
$ sudo kill -9 プロセスID
自己責任でお願いします。
パラメータにjavascriptの関数を渡すことができる。
例:
firebase > onChatTest({sendDateTime: new Date() })
環境変数をセットしている場合、下記のコマンドで予めランタイム設定ファイルを生成しておく必要がある。
firebase functions:config:get > .runtimeconfig.json
以上。
ベトナムで開発会社を立ち上げて7年目。日中は経営とチーム開発、夜は個人開発者としてエンジニア向けの英語学習サイト エンジリッシュ https://t.co/BInYt6Rwrh や日程調整アプリ アイテマス https://t.co/GXYFqGyEHF 作ってます!
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント