[Firebase]Cloud Functions for Firebase で runtime を Node.js 12 にしてデプロイする方法


はじめに

Cloud Functions for Firebase でデプロイの際にnodeのバージョン周りでエラーが出てハマったのでまとめました。
簡潔に設定の仕方を紹介した後、ハマりどころを末尾に記載しておきます。

runtime を Node.js 12 にしてデプロイする方法

やり方は全部で2つあります。

1. package.jsonに記述する方法

以下のようにenginesに"node":"12"と記載する

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {

  },
  "engines": {
    "node":"12"
  },
  "dependencies": {

  },
  "devDependencies": {

  },
  "private": true
}

2. firebase.jsonに記述する方法

firebase functions をinitするとinitしたカレントディレクトリに firebase.jsonが作成されると思います。そこに以下のような記述を足すことでランタイムを指定できます!

{
  "functions": {
    "runtime": "nodejs12",
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ]
  }
}

v8.6.0で変更があったみたいです。 or と書いてあるように、package.jsonでやるやり方も使えます

公式リリースノート

ランタイム指定がうまくいった時のdeployのログ

以下のように、 creating Node.js 12 ~~~ と出ていれば指定できています!

大前提・要注意

1. FirebaseのプランをBlazeプラン(従量課金プラン)にすること

2. グローバルインストールされている firebase-toolsが最新のものであること!

これが古いままだと以下のようなエラーが出ます

Error: package.json in functions directory has an engines field which is unsupported. The only valid choices are: {"node": "8"} and {"node": "10"}.

3. 使用しているライブラリが必要とするnodeのバージョン要件をローカル環境が満たしていること!

deployなのでてっきりpackage.jsonに正しくランタイム指定されていればクラウド上で問題なくビルドしてくれると思ってましたが、どうやら自分が想像していたのとはビルドの仕組みが違うみたいで..(勉強します。)

自分は使用しているライブラリがnode v12以上を要求していたにも関わらず、ローカルのnodeのバージョンがv10系だったため、延々と以下のエラーが出てしまいました。

Error: There was an unknown problem while trying to parse function triggers. Please ensure you are using Node.js v6 or greater.

自分はnodebrewを使っていたので以下で解決しました。バージョンはご自身のライブラリの要件に合わせてしよしなに変えてください。

nodebrew use 12.20.1

新しく作った環境にfirebase-toolsがない場合は以下も実行

npm i -g firebase-tools

参考

公式リリースノート
Cloud Functions for FirebaseでNode.js 12を利用する方法