firebase-toolsのコマンドの使い方


firebase-toolsのコマンドの使用方法について以下にメモします。必要に応じて更新します。

Firebaseプロジェクトは既に作成されていることを前提とします。インストール方法などは、@kohasiさんの[Firebaseの始め方](http://qiita.com/kohashi/items/43ea22f61ade45972881)にあります。


### 参考元
https://github.com/firebase/firebase-tools

# firebase-toolsのインストール

```bash
# firebase toolをインストール
npm install -g firebase-tools
```

# ログイン
以下のコマンドを実行するとgoogleのアカウント選択画面がでます。

```bash
firebase login

✔  Success! Logged in as <mail address>
```

Firebase CLIに許可を与えてください。

![Screen Shot 2016-09-30 at 13.51.10.png](https://qiita-image-store.s3.amazonaws.com/0/37910/91114482-03df-7e2a-1690-ebfce2d671d0.png "Screen Shot 2016-09-30 at 13.51.10.png")


# ログアウト

```bash
firebase logout
```


# firebaseへのデータ挿入

## jsonデータの作成

firebase-toolsを使用してfirebaseへデータを挿入するには、json形式データを作成する必要があります。
1行データなど簡単なデータは標準入力で作成可能ですが、ここではテキストファイルに作成します。[^editor]

[^editor]: jsonデータの検証は、オンラインエディタが便利です[JSON Editor Online](http://www.jsoneditoronline.org)

```json:heroes.txt
{ "heroes": [
    { "id": 11, "name": "Mr. Nice" },
    { "id": 12, "name": "Narco" },
    { "id": 13, "name": "Bombasto" },
    { "id": 14, "name": "Celeritas" },
    { "id": 15, "name": "Magneta" },
    { "id": 16, "name": "RubberMan" },
    { "id": 17, "name": "Dynama" },
    { "id": 18, "name": "Dr IQ" },
    { "id": 19, "name": "Magma" },
    { "id": 20, "name": "Tornado" }
  ]
}
```

## プロジェクトの表示

以下のコマンドを実行すると、作成済みのプロジェクト一覧が表示されます。
ここで表示されるProject IDは後で使います。
例では、`project-12345`となっていますが、作成したプロジェクト名に読み替えてください。

```bash
firebase list

# outputの例
#  ┌──────────────┬───────────────────────┬─────────────┐
#  │ Name         │ Project ID / Instance │ Permissions │
#  ├──────────────┼───────────────────────┼─────────────┤
#  │ Project      │ project-12345         │ Owner       │
#  └──────────────┴───────────────────────┴─────────────┘
```


## firebaseに格納する

以下のコマンドでコマンドラインからデータを挿入できます。
ここではパスをルート`/`にしていますが、用途に応じて変更してください。
<b>注意：ルート`/`に指定した場合、同一プロジェクトで既に登録した同階層及び、配下のデータが全て削除されます。</b>

 
```bash
# Usage: database:set [options] <path> [infile]
firebase database:set --project project-12345 / heroes.txt 
```


# 格納したデータの取得

以下のコマンドで格納したデータを取得できます。

```bash
# Usage: database:get [options] <path>
firebase database:get --project project-12345 /

# output
# {"heroes":[{"id":11,"name":"Mr. Nice"},{"id":12,"name":"Narco"},{"id":13,"name":"Bombasto"},{"id":14,"name":"Celeritas"},{"id":15,"name":"Magneta"},{"id":16,"name":"RubberMan"},{"id":17,"name":"Dynama"},{"id":18,"name":"Dr IQ"},{"id":19,"name":"Magma"},{"id":20,"name":"Tornado"}]}
```

データは[firebaseコンソール](https://console.firebase.google.com/?hl=ja)のDatabaseからも確認できます。
![Screen Shot 2016-10-03 at 17.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/37910/c6f15afe-cf0a-4caf-8a34-533cad277fb6.png "Screen Shot 2016-10-03 at 17.01.46.png")


## バックアップ/リストアシェルの例

こんな感じのシェルがあると、データの保管やリストアに便利です。
標準入力により、バックアップか、リストアか、リストアなら何のファイルを？を選択して実行できます。

```bash:
export PATH=###パスを通してない場合npm、firebaseがある場所を指定###
BACKUP_DIR=###バックアップディレクトリ###
PROJECT_NAME=###プロジェクト名###
PREFIX=###ファイルの拡張子や識別子 ex) firebase.json###
FIREBASE_DIR=###バックアップ取得対象###

echo -e "1 backup\n2 restore"
read -p  "select number :" num

[ ! -e $BACKUP_DIR ] && mkdir -p $BACKUP_DIR

case $num in
1)
  DATE=`date "+%Y%m%d%H%M%S"`
  echo "backup to ${DATE}.${PREFIX}"
  firebase database:get --project ${PROJECT_NAME} ${FIREBASE_DIR} >${BACKUP_DIR}/${DATE}.${PREFIX};;

2)
  options=(`ls -t1 ${BACKUP_DIR}/*.${PREFIX}`)
  i=1; for option in ${options[@]}; do echo $i $option; i=$((i+1)); done
  read -p  "select number :" num
  target=${options[$((num-1))]}
  echo "restore from ${target}"
  firebase database:set --project ${PROJECT_NAME} ${FIREBASE_DIR} ${target};;
esac

if [ $? = 0 ]; then echo "success."; else echo "failure"; fi
```




# firebase database:XXX系コマンド

|コマンド|説明|Usage|
|:--|:--|:--|
|database:get|プロジェクトのデータベースからデータを取得し、JSON形式で表示する。インデックスクエリをサポートする。|`firebase database:get [options] <path>`|
|database:set|指定したデータベースの部分の全てのデータを置換する。入力にはファイル、標準入力、コマンドライン引数が使える。|`firebase database:set [options] <path> [infile]`
|database:update|指定したデータベースの部分に更新を行う。入力にはファイル、標準入力、コマンドライン引数が使える。|`firebase database:update [options] <path> [infile]`|
|database:push|指定したデータベースの部分にリストを入れる。入力にはファイル、標準入力、コマンドライン引数が使える。|`firebase database:push [options] <path> [infile]`
|database:remove|指定したデータベースの部分のデータを削除する。|`firebase database:remove [options] <path>`|


# 雑記
 - データベースのルールをコマンドラインから取得する方法を探しましたが、見つけられませんでした。:(