firebase-toolsを8系にバージョンアップしたときにwebpackのビルドがコケた話
経緯
個人開発でフロントエンドにVue.js、バックエンドにFirebaseを利用したアプリケーションを作っています。(気が向いたときに作業しているので中々進みませんが。。)
最近ふと思い立ってnpmパッケージのバージョンを上げようと思ったところ、firebase-tools
のバージョンアップに苦しんだので供養しておきます。
※バージョンアップ前は v7.3.2 でした。
※firebase-tools
v8.0.0のリリースは2020年4月1日なので、投稿時点で約半年経過していることになります。。
firebase-tools
の使いどころ
firebase-tools
はコマンドラインツールとして、プロジェクトの設定やデプロイなどを実行できます。
しかしコマンドラインから操作するだけではなく、webpackでFirebaseのプロジェクトを切り替える方法で紹介されているようにNode.jsのコードから利用することも可能で、webpack の loader の処理として利用することができます。
// https://medium.com/google-cloud-jp/webpack-multiproject-firebase-55d5bd8beb5d より引用
const firebaseTools = require('firebase-tools')
function FirebaseConfigLoader () {
const callback = this.async()
firebaseTools.setup.web().then(config => {
callback(null, JSON.stringify(config))
}).catch(err => callback(err))
}
module.exports = FirebaseConfigLoader
firebase-tools
v8.0.0 で何があったか
詳細はリリース情報を見ていただくとして、Breaking Change がいくつかあるのですが、今回苦しめられたのは以下のものです。
BREAKING: Removes
firebase setup:web
command (replacement:firebase apps:sdkconfig web
).
読んでわかる通りsetup:web
コマンドを削除したのでapps:sdkconfig web
を使ってね、と指示されています(非推奨になったのはv7.3.0-2019年8月28日リリース)。
コマンドラインでは使用したことはありませんが、webpack の loader で使っているので影響がありました。
最初の対応
最初はただ単純に、指示されている通りapps:sdkconfig web
で呼び出すように変更しました。
const firebaseTools = require('firebase-tools')
function FirebaseConfigLoader () {
const callback = this.async()
- firebaseTools.setup.web().then(config => {
+ firebaseTools.apps.sdkconfig("web", "", {}).then(config => {
callback(null, JSON.stringify(config))
}).catch(err => callback(err))
}
module.exports = FirebaseConfigLoader
しかしコードを変更したのちビルドすると、以下のようなエラーを吐いて無事コケてしまいました。
ERROR Failed to compile with 1 errors
error in ./firebase-config.json
Module build failed (from ./firebase-config-loader.js):
FirebaseError: There are no WEB apps associated with this Firebase project
at /hoge/node_modules/firebase-tools/lib/commands/apps-sdkconfig.js:25:19
at Generator.next (<anonymous>)
at /hoge/node_modules/firebase-tools/lib/commands/apps-sdkconfig.js:8:71
at new Promise (<anonymous>)
at __awaiter (/hoge/node_modules/firebase-tools/lib/commands/apps-sdkconfig.js:4:12)
at selectAppInteractively (/hoge/node_modules/firebase-tools/lib/commands/apps-sdkconfig.js:23:12)
at /hoge/node_modules/firebase-tools/lib/commands/apps-sdkconfig.js:69:39
at Generator.next (<anonymous>)
at fulfilled (/hoge/node_modules/firebase-tools/lib/commands/apps-sdkconfig.js:5:58)
at process._tickCallback (internal/process/next_tick.js:68:7)
エラーメッセージから察するにコード修正は間違っていなさそうです。が、念のためコマンドラインからも実行してみたところ、同じエラーメッセージが返ってきたのでコード以外に問題があることがわかりました。
$ npx firebase apps:sdkconfig web
Error: There are no WEB apps associated with this Firebase project
エラーの解消方法
エラーメッセージで色々検索してもピンポイントの記事が見つからず、手当たり次第に探したところ公式のFirebase を JavaScript プロジェクトに追加するを発見しました。ここに記載されている通り、Firebase コンソールから「アプリを登録する」ことで解消できました。
設定したのちコマンドラインから実行すると確かに config が取得できていることが確認できます。もちろん、ビルドも成功しました。
$ npx firebase apps:sdkconfig web
✔ Downloading configuration data of your Firebase WEB app
// Copy and paste this into your JavaScript code to initialize the Firebase SDK.
// You will also need to load the Firebase SDK.
// See https://firebase.google.com/docs/web/setup for more details.
firebase.initializeApp({
"projectId": "...",
"appId": "...",
"databaseURL": "...",
"storageBucket": "...",
"locationId": "...",
"apiKey": "...",
"authDomain": "...",
"messagingSenderId": "..."
});
結論
今回firebase-tools
をv8.0.0にバージョンアップする際にやることは2つありました。
- コードの修正
- Firebase コンソールから「アプリを登録する」
最後に
Firebase コンソールから「アプリを登録する」ということは、通常 Firebase プロジェクトを作成するときは必ずやっているものなのでしょうか。
実は最近設定できるようになった・するようになった項目、であれば心荒れることなく過ごせそうです。
参考
- webpackでFirebaseのプロジェクトを切り替える方法
- firebase-tools v7.3.0 release
- firebase-tools v8.0.0 release
- Firebase を JavaScript プロジェクトに追加する
Author And Source
この問題について(firebase-toolsを8系にバージョンアップしたときにwebpackのビルドがコケた話), 我々は、より多くの情報をここで見つけました https://qiita.com/skaji18/items/71f3c29b1320bbc1c74f著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .