OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

Firebase CLIでdeploy先のデフォルトプロジェクトが変わらない

たいした話じゃないんだけれど、ビックリしたのでメモ。

現象

firebase-toolsを使ってコマンドからデプロイとかやろうと思うじゃないですか。

(firebase-toolsのバージョンは 6.1.2)

firebase init で対話的にポチポチ初期設定していくと、デフォルトのデプロイ先プロジェクトを選択するところがある。

ところが、Firebaseのコンソール画面から作ったばかりのプロジェクトがこの選択項目に出てこないことがあった。なんでかわからない、ちょっと待たないとダメなのかもしれない、まあそれはいい。

とりあえず適当な別のプロジェクト hoge-app を選択しておいて、あとから本来使いたい piyo-app に書き換えよう。

セットアップを終えると、 .firebaserc が以下のようになる。

{  
  "projects": {  
    "default": "hoge-app"  
  }  
}

このdefaultを piyo-app に書き換えて、よし firebase deploy だと思ったら、デプロイ先が hoge-app のままになっていて、困惑したのち、勘違いに気がついた。

プロジェクトの選択コマンド

firebase-toolsでは、 firebase use コマンドでデプロイ先のプロジェクトを選択できるようになっている。

hoge-app を選択するときは firebase use hoge-app となる。

で、じゃあ .firebasercprojects はなんだってゆーと、ここには firebase use で選択可能なプロジェクトのエイリアス名が定義できるようになっているわけである。

たとえば .firebaserc を以下のようにして

{  
  "projects": {  
    "hoge": "hoge-app",  
    "piyo": "piyo-app"  
  }  
}  

firebase use hoge とやっても hoge-app を選択することができる。

で、さらにさらに firebase-tools は プロジェクトが直接選択されているのかエイリアスで選択されているのかを区別している らしい。

.firebaserc を以下のように直して実験。

{  
  "projects": {  
    "default": "hoge-app"  
  }  
}  

firebase use default で hoge-appを選択する。現在のデプロイ先は firebase target コマンドで確認できる。

> firebase target  
Resource targets for hoge-app:  

この状態で、 .firebaserc の defaultを piyo-app に書き換える。

{  
  "projects": {  
    "default": "piyo-app"  
  }  
}  

確認。

> firebase target  
Resource targets for piyo-app:  

default というエイリアス名で選択されている場合は、 .firebaserc を書き換えるだけでデプロイ先も変更されるのである。

最初の現象の解明

firebase init コマンドの対話でデフォルトプロジェクトを選択した際、 default というシンボルで選択された状態になるのかと思いきや、プロジェクトそのものが直接選択された状態になっているわけですね。

なので .firebasercdefault を書き換えただけではデプロイ先は変わらない。

明示的に firebase use default コマンドを打っておけば、以降は default で定義されたプロジェクトが動的にデプロイ先として使用されるようになる。

感想

このデプロイ参照のしくみはちょっとこわいので、複数のデプロイ先を切り替えて使う場合は、明示的に名前をつけて切り替えたほうがいいっすね。