Firebase CLI のアクティブプロジェクトとエイリアス

本記事では、Firebase CLI の管理データに触れながら、プロジェクトディレクトリと Firebase プロジェクトを関連付ける方法をみていきます。

【目次】

[1]はじめに

前の記事『Firebase CLI の使い方とWebアプリ開発環境の簡単な動作確認』では、プロジェクトディレクトリにある「firebase.json」ファイルが、Firebase プロジェクトにデプロイする内容を定義している旨を書きました。

一方「firebase.json」ファイルには、デプロイ先となる具体的な Firebase プロジェクトを指定しないことも書きました。

Firebase CLI では、プロジェクトディレクトリのデプロイ先となる Firebase プロジェクトを指定する方法をいくつか用意しています。

これらのドキュメントには、--project フラグ、アクティブプロジェクト、エイリアスなどの方法とコマンドの説明がありますが、それらの関係性や動作が(私にとっては)少し分かり難い気がします。

そこで本記事では、Firebase CLI の管理データに触れながら、プロジェクトディレクトリと Firebase プロジェクトを関連付ける方法をみていきます。加えて、関連するTips的なことにも触れます。

なお、本記事の内容は私なりの理解で書いていますので、間違いなどありましたらご容赦ください。

(参考)
プロジェクトディレクトリについては、記事『Firebase CLI の使い方とWebアプリ開発環境の簡単な動作確認/[3]プロジェクトディレクトリの初期化』も参考にしてください。

また本記事のコマンド例は、プロジェクトディレクトリ(firebase.json ファイルがあるディレクトリ)をカレントディレクトリにして実行することを前提としています。プロジェクトディレクトリではないディレクトリからコマンドを実行する場合は、-c または --config フラグを利用してください。

[2]概要

Firebase CLI を利用するとき、プロジェクトディレクトリを実際の Firebase プロジェクトに関連付けるには、優先順位が高い順に以下の方法があります。
  1. -P または --project フラグ
    • Firebase CLI の各コマンドを実行するときに -P または --project フラグでプロジェクトIDまたはエイリアスを指定します。
    • -P または --project フラグはアクティブプロジェクトより優先します。
  2. アクティブプロジェクト
    • アクティブプロジェクトは、プロジェクトディレクトリに対するデフォルトの Firebase プロジェクトと考えることができます。
      • -P または --project フラグを省略した時、プロジェクトディレクトリに対するアクティブプロジェクトが評価されます。
    • アクティブプロジェクトは firebase use コマンドで設定します。
      • 暗黙のアクティブプロジェクト?(後述)もあります。
    • アクティブプロジェクトの情報は、「~/.config/configstore/firebase-tools.json」の activeProjects に、プロジェクトディレクトリのパスとプロジェクトID(またはエイリアス)のペアが記録されます。
  3. エイリアス
    • エイリアスはプロジェクトIDに対する別名で、Firebase プロジェクトに dev や prod のように利用用途を意味する名前を付けて利用できます。
    • エイリアスは複数登録でき、エイリアスを利用してアクティブプロジェクトの切替や -P または --project フラグの指定にも利用できます。
    • エイリアスは firebase use --add コマンドで登録します。
    • 登録したエイリアスの情報は、プロジェクトディレクトリの .firebaserc ファイルで保存/管理されます。

分かり難いとは思いますが、上記の関係をざっくりとした図にしてみました。

Firebase CLI のアクティブプロジェクトとエイリアス

-P または --projecct フラグで直接プロジェクトIDを指定するだけでなく、アクティブプロジェクトやエイリアスといった仕組みの間接層を利用する管理も可能になっています。

このように書くと複雑そうに見えますが、使い方は難しいものではありません。

以降では使い方とあわせて見ていきます。

[3]関連付け状態の確認

Firebase プロジェクトとプロジェクトディレクトリの関連付け状態を確認するには以下のコマンドを実行します。
firebase use

このコマンドにより以下の情報が得られます。
  • アクティブプロジェクト(Active Project)
  • エイリアスのリスト(Project aliases for プロジェクトディレクトリ)

なお、アクティブプロジェクトやエイリアスはプロジェクトディレクトリに対して設定するものであるため、カレントディレクトリがプロジェクトディレクトリでない状態で firebase use コマンドを実行すると以下のエラーになります。
Error: firebase use must be run from a Firebase project directory.

この場合、プロジェクトディレクトリをカレントディレクトリにするか、-c または –config フラグを利用します。

[4]-P または --project フラグ

Firebase CLI コマンドを実行するときに、-P または --project フラグを利用して Firebase プロジェクトを明示的に指定することができます。

-P または --project フラグの後に、プロジェクトIDかエイリアスで Firebase プロジェクトを指定します。

以下はデプロイコマンドでの利用例です。(どれも同じ内容です。)
firebase deploy -P プロジェクトID または エイリアス
firebase deploy --project プロジェクトID または エイリアス
firebase deploy --project=プロジェクトID または エイリアス
(補足:フラグとプロジェクトID(またはエイリアス)の区切り)
上記例のように、--project フラグの場合は「=」またはスペースの区切りが利用できますが、-P フラグの場合はスペースで区切るようです。

-P または --project フラグの指定は、後述のアクティブプロジェクトやエイリアスの設定より優先します。

また、アクティブディレクトリやエイリアスの設定を行っていなくても利用できます。
CI/CD環境など、アクティブプロジェクトやエイリアスを利用しない場合や、一時的にデプロイ先を変更したい場合などに便利かと思います。

一方で、開発作業中など、 Firebase CLI コマンドをよく利用する場合では、毎回フラグを指定するのは面倒です。このような場合は、後述のアクティブプロジェクトを設定して利用し、一時的に別の Firebase プロジェクトにデプロイするようなシナリオでフラグを利用するのが便利だと思います。

(補足)
エイリアスを指定する場合は、予めエイリアスを登録しておく必要があります。

例えば、登録していないエイリアス xxx を firebase use に指定すると、「Error: Invalid project selection, please verify project xxx exists and you have access.」というエラーになります。

一方、プロジェクトIDは、エイリアスに登録済みかどうかに関係なく、任意のプロジェクトIDを指定できます。

[5]アクティブプロジェクト

(1)アクティブプロジェクトの設定

Firebase CLI コマンドを実行する都度、-P または --project フラグを指定するのは面倒なので、フラグを省略した時のデフォルトの Firebase プロジェクトを設定できれば便利です。

このデフォルトの Firebase プロジェクトにあたるのがアクティブプロジェクトです。

アクティブプロジェクトは、プロジェクトディレクトリに対して設定します。これはアプリ毎にアクティブプロジェクトを設定できるということでもあります。

プロジェクトディレクトリにアクティブプロジェクトを設定するには、プロジェクトIDまたはエイリアスを引数に指定して firebase use コマンドを実行します。
firebase use プロジェクトID または エイリアス

これは、-P または --project フラグにプロジェクトIDまたはエイリアスを指定できるのと同様です。

プロジェクトIDは、エイリアスに登録済みかどうかに関係なく、任意のプロジェクトIDを指定できますが、エイリアスは登録済みのものを指定する必要があります。

なお、firebase use コマンドで指定するプロジェクトIDまたはエイリアスは、「~/.config/configstore/firebase-tools.json」ファイルの activeProjects に、プロジェクトディレクトリと、指定したプロジェクトIDまたはエイリアス、のペアで記録されます。

(2)アクティブプロジェクトのクリア

firebase use コマンドで設定したアクティブプロジェクトは以下のコマンドでクリアできます。
firebase use --clear

実装の観点からみると、クリアは「~/.config/configstore/firebase-tools.json」ファイルの activeProjects に記録されているプロジェクトディレクトリの情報を削除するだけです。

つまり、登録済みのエイリアス(.firebaserc ファイルに記録されているもの)には影響しません。

なお、firebase use –clear コマンドでアクティブプロジェクトをクリアしたとしても、後述の暗黙のアクティブプロジェクト?の評価がありますので、エイリアスが1つだけ登録されている場合は、クリアが動作していないのでは?と思われるかもしれません。

[6]エイリアス

(1)概要

エイリアスとは、プロジェクトディレクトリに関連付けるプロジェクトIDに対する別名です。

特に、1つのプロジェクトディレクトリに複数の Firebase プロジェクトを関連付けて管理したい場合、Firebase CLI では、エイリアスの仕組みを使って管理するのが便利です。

例えば、開発環境と本番環境があり、そのプロジェクトIDがそれぞれ「proj_1」と「proj_2」とすると、「dev」と「prod」のように利用用途を意味する名前(エイリアス)を割り当てます。

そして、アクティブプロジェクトの切替や -P または --project フラグの指定にエイリアスを利用します。
(開発環境と本番環境のアクティブプロジェクトの切替は、firebase use dev または、firebase use prod のように行います。)

プロジェクトIDを直接指定せず、エイリアスを利用することのメリットとしては色々と考えられますが、少し例を書いてみます。
  • エイリアスは、利用用途に応じた名前を設定できるので、プロジェクトとの関連が分かりやすくなります。(タイプミスも軽減できるかも?)
  • エイリアスはプロジェクトIDに対する間接層ですので、例えば、Firebase プロジェクトを再構築して差し替えたい場合、エイリアス名は変更せず(開発フローは変更せず)、エイリアス名に対応付けているプロジェクトIDの変更のみで対応できます。
  • エイリアスはプロジェクトディレクトリに閉じた名前なので、プロジェクト間で共通のエイリアスを用いて開発フローを作れます(エイリアス毎に異なるプロジェクトIDを割り当てます)。
    • 例えば、アプリAとアプリBを開発していて、それぞれ開発環境と本番環境があるとします。各アプリにエイリアス dev と prod を定義し、それぞれに対応する Firebase プロジェクトを設定します。これにより、各アプリ開発でCLIコマンドを利用する際は dev と prod のエイリアスだけとなり、共通したエイリアスを用いた開発フローができるかもしれません。

エイリアスについての詳細は以下を参照して下さい。

エイリアスの登録や削除などの管理は、Firebase CLI のコマンドを利用します。以下ではこれらについて見ていきます。

ところで、エイリアスの情報はプロジェクトディレクトリにある「.firebaserc」ファイルの projects に「エイリアス」と「プロジェクトID」のペアで保存/管理されます。

.firebaserc ファイルはJSONファイルであり、テキストエディタなどで編集可能です。
但し、ドットで始まるいわば隠しファイルですし、ファイル内の仕様は明確にドキュメント化されていないように思えますので、基本的にはテキストエディタで編集することは意図されていないように思えます。

(2)エイリアスの新規登録と変更

ここでは新しくエイリアスを登録する方法と、登録したエイリアスを変更する方法をいくつか見ていきます。

①対話的に新規登録とプロジェクトIDの変更する

以下のコマンドで、新しくエイリアスを登録、または、登録したエイリアスのプロジェクトIDを変更することができます。
firebase use --add

このコマンドを実行すると対話的に進みます。

? Which project do you want to add?
アクセス可能な Firebase プロジェクトのプロジェクトIDがリスト表示されますので、関連付けたいプロジェクトを選択します。

? What alias do you want to use for this project? (e.g. staging)

ここでエイリアスを入力しますが、入力するエイリアスによって新規登録か登録済みのエイリアスのプロジェクトIDの変更になります。
  • エイリアスを新規登録する場合
    • まだ登録していないエイリアスを入力します。
      • 任意の名前を利用できますが、意図が明確な名前が良いと思います。
    • 新しいエイリアスとプロジェクトIDのペアが .firebaserc に記録され、入力したエイリアスがアクティブプロジェクトになります。
  • エイリアスのプロジェクトIDを修正したい場合
    • 登録済みのエイリアスを入力します。
    • 既存のエイリアスに対するプロジェクトIDが、先に選択したプロジェクトIDに変更されて .firebaserc に保存されると同時に、そのエイリアスがアクティブプロジェクトになります。

このコマンド実行後には指定したエイリアスがアクティブプロジェクトになることに注意してください。

アクティブプロジェクトを変更したい場合は、firebase use コマンドを利用して変更します。

②非対話で新規登録とプロジェクトIDの変更する

firebase use コマンドのソースコードを見ると、--alias フラグがありました。これを利用すると対話的に行う内容を一度に実行できます。
firebase use --add プロジェクトID --alias エイリアス

対話的に進めるのと同様に、指定するエイリアスによって新規登録か登録済みのエイリアスのプロジェクトIDの変更になります。

③エイリアスの名前だけを変更したいとき

私が知らないだけかもしれませんが、エイリアスのプロジェクトIDは変更せず、エイリアスの名前だけを変更するコマンドは無いように思えます。

コマンドで行うなら、変更したいエイリアスを削除して、新しくエイリアスを登録すると同じことができると思います。

あるいは、.firebaserc ファイルを直接編集し、 firebase use でアクティブプロジェクトの設定を併せて行う方法もあるかと思います。

(3)エイリアスを利用した Firebase プロジェクトの指定

エイリアスを利用して Firebase プロジェクトを指定することができます。
  • アクティブプロジェクトをエイリアスで指定する
    • firebase use エイリアス
  • -P または --project の引数にエイリアスを指定する
    • 例)firebase deploy -P エイリアス

(4)エイリアスの削除

エイリアスを削除したい場合は、以下のコマンドを実行します。
firebase use --unalias エイリアス

このコマンドを実行すると、.firebaserc ファイルに記録されているエイリアスが削除されます。

一方、アクティブプロジェクトの設定は変更しないため、削除するエイリアスがアクティブプロジェクトだった場合は少々紛らわしい動作になります。

具体的には、firebase use で確認すると、アクティブプロジェクトが削除したエイリアスになっている一方で、エイリアスからは削除されている状態になります。この状態のままでは、デプロイなどのコマンドを実行すると失敗します。

このため、削除するエイリアスがアクティブプロジェクトの場合は、再度 firebase use でアクティブプロジェクトを設定する必要があります。

(5)暗黙のアクティブプロジェクト?(エイリアスが1つの場合)

「firebase use プロジェクトID または エイリアス」で明示的にアクティブプロジェクトを設定することができます。

しかし、アクティブプロジェクトを設定していない(firebase-tools.json ファイルの activeProjects にエントリがない)状態で、かつ、登録しているエイリアスが1つのみの場合(.firebaserc にエイリアスが1つ登録されている場合)、そのエイリアスがアクティブプロジェクトとして評価されるようです。

この動作をここでは、明示的なアクティブプロジェクトの指定に対して、「暗黙のアクティブプロジェクト」ということにします。(この動作はドキュメントに書かれていないように思えます。)

なお、この暗黙のアクティブディレクトリは、firebase-tools.json ファイルの activeProjects に追加されるものではありません。

暗黙のアクティブプロジェクトが評価される例を書いてみます。
  • エイリアスを1つだけ登録しているプロジェクトディレクトリをコピーあるいはリネームして、パスが異なるプロジェクトディレクトリを作った場合。
    • 元のプロジェクトディレクトリに .firebaserc ファイルがあれば、エイリアスが引き継がれます。.firebaserc ファイルにエイリアスが1つだけの場合は、このエイリアスがアクティブプロジェクトとして評価されるようです。
  • firebase use --clear コマンドでアクティブプロジェクトをクリアした時
    • --clear フラグは firebase-tools.json の activeProjects のエントリを削除しますが、エイリアスの定義を削除するわけではありません。activeProjects のエントリが無い時、.firebaserc ファイルにエイリアスが1つだけなら、これがアクティブプロジェクトとして評価されるようです。

ちなみに、アクティブプロジェクトの設定が無く、エイリアスが2つ以上あれば、firebase use コマンドのアクティブプロジェクト表示は「No project is currently active, and no aliases have been created..」となり、暗黙のアクティブプロジェクトはありません。

同様に、エイリアスが1つも無ければ、firebase use コマンドのアクティブプロジェクト表示は「No project is currently active.」となり、当然暗黙のアクティブプロジェクトもありません。

[7]その他のTipsっぽいこと

(1)firebase init による Firebase プロジェクトとの関連付け

新規にアプリの開発ディレクトリを作る場合は、firebase init コマンドを利用することが多いと思います。
(firebase init コマンドについては、記事『Firebase CLI の使い方とWebアプリ開発環境の簡単な動作確認/[3]プロジェクトディレクトリの初期化』も参考にしてください。)

firebase init コマンドでは、「Project Setup」の項目で、以下のように Firebase プロジェクトと関連付けが行われます。
  • 「default」というエイリアスで、プロジェクトIDが設定されます。
    • .firebaserc ファイルに、default とプロジェクトIDのペアが保存されます。
  • 明示的にプロジェクトIDがアクティブプロジェクトに設定されます。
    • firebase-tools.json ファイルの activeProjects に、プロジェクトディレクトリとプロジェクトIDのペアが保存されます。
    • default というエイリアスが記録されるわけでは無いようです。

ちなみに、「Project Setup」の項目で関連付けを行わなかった場合(Don't set up a default project を選択した場合)は、上記のようなエイリアスとアクティブプロジェクトの設定は行われません。

なお、「default」という意味ありげな名前のエイリアスが設定されますが、Firebase CLI の処理としては「default」というエイリアスに特別な意味は無いように思えます。

(2)アプリの構成情報と Firebase プロジェクト

本記事ではプロジェクトディレクトリに対して Firebase プロジェクトを指定する方法を書き、複数のプロジェクトを切り替える方法も書きました。

一方で、Firebase プロジェクトの変更は、アプリの内容によっては少々面倒な問題も検討する必要があります。

例えば、アプリの構成情報(Webの場合は構成オブジェクト、スマホの場合は構成ファイル)です。アプリの構成情報には、プロジェクトIDやAPIキーを含んでいます。

Webアプリ用の Firebase プロジェクトとして開発環境と本番環境の2つを用意したとします。そして、開発環境の構成オブジェクトをコピペしてアプリに組み込み、開発環境の Hosting にデプロイしてテストを完了したとします。その後、デプロイ先を変更してアプリを本番環境の Hosting にデプロイしたとします。

これで本番環境の Hosting でアプリは動作するかもしれませんが、構成オブジェクトの内容は開発環境を指したままなので、もし Authentication や Storage 等のサービスを利用している場合は、開発環境の情報にアクセスして動作することになります。(認証済ドメインの設定などが必要な場合はエラーになって動作しないかもしれません。)

これについての解決策はいろいろあると思いますが、Firebase が提供しているWebアプリにおける解決策の例として、予約済み URL があります。

これ以外にも、アプリで環境に依存した処理がある場合は、検討が必要になるかもしれません。

(3)サンプルプログラムなどを動かす場合

Firebase アプリのオープンソースサンプルなど、.firebaserc ファイルが含まれていないソースをダウンロードして、新しい Firebase プロジェクトで動かす場合の手順例を考えて見ます。(あくまでも例です。)

  1. Firebase プロジェクトを準備します。
    • Firebase コンソールまたは Firebase CLI を利用してプロジェクトを準備します。
    • プログラムによっては AuthenticationやStorageなどのサービスの設定が必要なものもありますので、Firebase コンソールから必要な設定を行います。
  2. ローカル環境にプロジェクトディレクトリを準備します。
    • firebase.json ファイルがあるディレクトリです。
  3. プロジェクトディレクトリから、firebase use --add コマンドを実行します。
    • 準備したプロジェクトを選択して、エイリアスに任意の名前を入力します。(特にこだわりが無い場合は、「default」としておきます。)
  4. 必要に応じて構成オブジェクトの設定を行います。
    • プログラムで構成情報を設定している部分を探して、必要なら準備したプロジェクトの構成情報に差し替えます。
    • それ以外にも、プログラム固有の準備事項があれば対処します。
  5. 準備した Firebase プロジェクトにデプロイして、動作確認します。

コメント

このブログの人気の投稿

VirtualBoxのスナップショット機能

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

Ubuntu/Colab環境でPDFファイルのページを画像化する(pdf2image、pdftoppm、pdftocairo)