Firebase CLI を Windows10 にインストールして、FirestoreエミュレーターをPython3で試してみる

# FirestoreエミュレーターをWindows10で起動させる

## Firebase CLI のダウンロードとインストール
npm（Node Package Manager）を使用して、Firebase CLI をインストールします。

まずは、[Node.js](https://www.nodejs.org/) をインストールします。

コマンドプロンプトを起動し、次のコマンドで Firebase CLI をインストールします。

``` コマンドプロンプト.
npm install -g firebase-tools
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/042bd505-fa30-218f-3eba-1c82ad114745.png)

これにより、グローバルに使用できる firebase コマンドが有効になります。

``` コマンドプロンプト.
firebase --version
```

## Firebase CLI にログイン

Google アカウントを使用して Firebase にログインし、正しくインストールされているかを確認します。

``` コマンドプロンプト.
firebase login
firebase list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/774fd10e-166d-5792-54a3-72179e736782.png)

## Firebase の初期化

Firebase用のディレクトリを作成し、Firebaseの初期化を行います。

``` コマンドプロンプト.
mkdir firebase-emu
cd firebase-emu
firebase init
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/aec61f9a-df57-e883-e6a8-65dfadb52073.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/70b483ec-91a8-f760-8cf2-502509d28258.png)

上下矢印キーでカーソル（>）を移動し、"Emulators: Set up local emulators for Firebase features" をスペースキーで選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/9bb9f535-a2f3-dc04-dfd0-4c20e172c9a2.png)

デプロイする予定はないので、"Don't set up a default project"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/1c9874f1-ebf6-c6c7-cd63-f6e55ec28dca.png)

"Database" を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/0bcc44f7-e0ca-063d-d1ce-3db3457a576f.png)

ポート番号は、デフォルトの9000のままとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ed263864-1bbd-03d2-a9d7-88d5356aa746.png)

最後に、"Y"で、エミュレーターのダウンロードを実行します。

## Firestore エミュレーターのセットアップ

初期化後、Firestoreのエミュレーターをセットアップします。

```コマンドプロンプト.
firebase setup:emulators:firestore
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/a7af87dd-843e-f1b1-b5fc-f0907682a57c.png)

## Open JDK のインストール

Firestoreのエミュレーターを実行するには、Javaが必要ですので、[jdk.java.net](https://jdk.java.net/)からzipファイルをダウンロードし、Cドライブ等に展開します。

展開後、binディレクトリをシステム環境変数のPathに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ed3ff211-4356-b2c2-a82e-60f7a22d087d.png)

## Firestoreエミュレーターの起動

新たにコマンドプロンプトを起動し、初期化したディレクトリへ移動します。
次のコマンドで、Firestoreエミュレーターを起動します。

``` コマンドプロンプト.
cd C:\temp\firebase-emu
firebase serve --only firestore
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/cacc2555-02bf-57e1-1846-64c05229ea79.png)

# Python3の仮想環境とライブラリのインストール

## Python2/3のインストールと仮想環境の有効化
### Python 2 と Python 3 のインストール
[Python のウェブサイト](https://www.python.org/downloads/windows/)から Python 2 と Python 3 両方の最新バージョンのWindowsインストーラをダウンロードし、インストールします**(2019/11/25現在 Python 3.7をインストールしてください)**。
※ インストール先は、C:\Python27やC:\Python37のように浅いフォルダにしています。

> **【Python2をインストールする理由】** GoogleのCloud SDK は Python で作成されています。アプリの開発に使用する Python のバージョンにかかわらず、Cloud SDK は Python 2.7.9 以降が必要になります。ただし、Python 3 virtualenv を使用している場合でも、Cloud SDK が Python 2 のインストールを検出し、使用できます。

###virtualenv のインストールと有効化
virtualenvをインストールします。

``` コマンドプロンプト.
py -3 -m pip install --upgrade virtualenv
```

次のコマンドで、virtualenvのバージョンを確認できます。

``` コマンドプロンプト.
py -3 -m virtualenv --version
```

virtualenv がインストールされたら、プロジェクト内に仮想環境を作成できます。次の virtualenv により、venv フォルダに Python のインストール全体の仮想コピーを作成します。
※ Python 3.7をC:\Python37にインストールしている場合、つぎのようにpython.exeのパスを指定します。

``` コマンドプロンプト.
cd C:\temp\firebase-emu
py -3 -m virtualenv --python "C:\Python37\python.exe" venv
```

コピーが作成されたら、次のように仮想環境を有効化して、Python の virtualenv のパスを コマンドプロンプト に通します。

``` コマンドプロンプト.
.\venv\Scripts\activate
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/98f15ed1-fc85-bd20-79b8-9b6cebaf07e5.png)

## Google Cloud Firestore API クライアントライブラリのインストール
[Google Cloud Firestore API クライアントライブラリ](https://pypi.org/project/google-cloud-firestore/)を次のコマンドでインストールします。

``` コマンドプロンプト.
pip install google-cloud-firestore
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/b9a3d314-6e82-3477-e8b0-48e612b36dd3.png)

#Firestoreエミュレーターで永続化する


## サービスアカウントの作成

1. GCP Console で [サービス アカウントキーの作成](https://console.cloud.google.com/apis/credentials/serviceaccountkey?hl=ja&_ga=2.221477457.-877932634.1573568210) ページに移動します。
1. 新しいプロジェクトを作成します(firebase-emu)。
1. [サービス アカウント] リストから [新しいサービス アカウント] を選択します。
1. [サービス アカウント名] フィールドに名前を入力します。
1. [役割] リストで、[プロジェクト] > [オーナー] を選択します。
1. [作成] をクリックします。キーが含まれている JSON ファイルがパソコンにダウンロードされます。
1. JSONファイルを c:\temp\firebase-emu\client_credentials.json として保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/3194c057-72b7-b63b-9afc-c17661ebe06f.png)


## Firestoreエミュレーターへの永続化

Pythonの仮想環境を有効化した状態で、FIRESTORE_EMULATOR_HOST環境変数とGOOGLE_APPLICATION_CREDENTIALS環境変数とを設定します。

```コマンドプロンプト.
SET FIRESTORE_EMULATOR_HOST=localhost:8080
SET GOOGLE_APPLICATION_CREDENTIALS=C:\temp\firebase-emu\client_credentials.json
```

Pythonインタープリターを起動します。

```コマンドプロンプト.
python
```

次のコードをPythonインタプリターにコピー＆ペーストして実行してください。

``` example.py
from google.cloud import firestore

db = firestore.Client()

# Query for documents
users_ref = db.collection(u'users')
for doc in users_ref.stream():
    print(u'{} => {}'.format(doc.id, doc.to_dict()))

# Add a new document
doc_ref = db.collection(u'users').document(u'alovelace')
doc_ref.set({
    u'first': u'Ada',
    u'last': u'Lovelace',
    u'born': 1815
})

# Then query for documents
users_ref = db.collection(u'users')

for doc in users_ref.stream():
    print(u'{} => {}'.format(doc.id, doc.to_dict()))


```

quit()で、Pythonインタープリターを終了します。
その後、Pythonインタープリターを起動して、再度、example.pyのコードをコピー＆ペーストして実行してみてください。

``` 終了.
quit()
```


#クリーンアップ
課金されないようにするには、GCP プロジェクトを削除してプロジェクト内のすべてのリソースへの課金を停止します。

1. GCP Console で [プロジェクト] ページに移動します。[→プロジェクト ページに移動](https://console.cloud.google.com/iam-admin/projects)
1. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
1. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

#まとめ
- Node.js と Firebase CLI をインストールし、Firestoreエミュレーターをセットアップしました。
- OpenJDKをインストールし、Firestoreエミュレーターを起動しました。
- Python2とPython3をインストールし、仮想環境（virtualenv）を設定しました。
- 仮想環境を有効化し、Google Cloud Firestore API クライアントライブラリをインストールしました。
- GCPにプロジェクトを作成し、サービスアカウントキーを作成、ダウンロードしました。
- Pythonインタープリター上で、Firestoreエミュレーターへ永続化しました。
- 課金されないように作成したGCPプロジェクトを削除しました。