Firebase-tools: Firestoreとデータベースエミュレーター:データセットを使用したインスタンスの初期化

作成日 2019年03月12日  ·  39コメント  ·  ソース: firebase/firebase-tools

データセットを使用してFirestoreエミュレーターのインスタンスを作成できると便利です。

現在、エミュレータのインスタンスを初期化またはリセットするためにバッチ書き込みを行っています。 問題は、120回の操作(テストデータセット)の更新に3秒近くかかることです。

スナップショットからFirestoreエミュレーターインスタンスを作成したり、大規模な更新のエミュレーターのパフォーマンスを向上させたりすることは可能でしょうか?

emulator-suite database firestore feature request

最も参考になるコメント

Firestoreエミュレーターにデータをインポートする機能(つまり、「シード」データでデータを初期化する機能)は、次のリリースで廃止される予定です。 最初は少し手動になりますが、今後のリリースでより優れたツールを追加する予定です。

RealtimeDatabaseエミュレーターに何が必要かを調べます。

全てのコメント39件

初期化時にデータベースの「スナップショット」をロードするのは素晴らしいことだと私は同意します。 現在、開発のためにファイアストアと関数エミュレーターをローカルで実行していますが、テストデータをDBにシードすると、一連のファイアストア関数トリガーが実行されます。 これはかなり望ましくないので、初期データのロードを支援する機能、またはさらに良いことに、ディスクへのファイアストアデータの永続性を支援する機能の計画はありますか?

関数なしでデータをシードしたいという点を指摘してくれてありがとう
発砲。 応急措置として、私たちは間違いなく「方向転換する方法を実装することができます
「オフ」関数は、データのロード中に特別な呼び出しでトリガーされます。
特定のテストにも役立つ可能性があります。 それを使いますか?

しかし、長期的には、インポート/エクスポートが必要です。

土、2019年10月12日には、11:54 AMワイアットアデスの[email protected]書きました:

データベースの「スナップショット」をロードするのは素晴らしいことだと私は同意します
初期化。 私は現在、firestoreとfunctionsエミュレーターを実行しています
開発のためにローカルで、しかし私がDBにテストデータをシードすると、たくさん
のfirestore関数トリガーが実行されます。 これはかなり望ましくないので、
初期データの読み込みに役立つ機能の計画はありますか、または、
さらに良いことに、ディスクへのファイアストアデータの永続性?


このスレッドにサブスクライブしているため、これを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/firebase/firebase-tools/issues/1167?email_source=notifications&email_token=ACATB2VEE7BBI75HECFTE23QOIMOLA5CNFSM4G5NG5X2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
または購読を解除する
https://github.com/notifications/unsubscribe-auth/ACATB2WHUTO43JISN54J4U3QOIMOLANCNFSM4G5NG5XQ

はい、それは今のところ良い解決策になるでしょう、ありがとう!

それで、これにはまだマイルストーンが設定されていませんか? しかし、ここでこのチームについて私が今気に入っていることの1つは、よりアクティブで応答性が高いようです。

ファイアストアデータベースと一緒に、このスコープにもリアルタイムデータベースを追加してください。

@anantanandguptaマイルストーンはまだありませんが、はい、進捗状況については本当にオープンにしようとしています。 また、データベースエミュレーターもスコープ内に追加しました。 データベースの場合、問題はより簡単です(JSON形式)が、クラウド機能を「一時停止」するのを支援する必要があります

私は私が良い手にあることを知っています。 しかし、重要性を伝えるために、私はこの巨大なプラットフォームをFirebaseを中心に完全に設計し、誰もがこれに反対しましたが、私の努力により、テクノロジーとしてFirebaseを使用するという私の決定が間違っていなかったことを今まで証明しました。 この時点で、クラウド上でホストされている共通のデータベースを使用して複数の開発者が複数の機能に取り組むことが不可能になるほど大きくなっています。 したがって、私たち一人一人がデータベースのローカルコピーで作業できれば、はるかに簡単で効率的になります。

Firestoreエミュレーターにデータをインポートする機能(つまり、「シード」データでデータを初期化する機能)は、次のリリースで廃止される予定です。 最初は少し手動になりますが、今後のリリースでより優れたツールを追加する予定です。

RealtimeDatabaseエミュレーターに何が必要かを調べます。

@ryanpbrewster 「シード」データの設定方法に関するドキュメントはありますか?

@SamyPesseこれはエミュレーターJAR自体の内部に実装されています( @ryanpbrewsterが言ったように)が、実際にはインポートを行うためにfirebase-toolsを介してAPIを公開していないため、これはまだ実際には使用できません。

これがどのように機能することを期待するかを共有していただけませんか? firebaseコマンドのフラグ、 firebase.jsonフィールド、またはその他のものをご希望ですか?

現在、データのインポートとエクスポートが実装されていますが、これらの機能を簡単に使用できるようにする方法がまだわかっていません。 したがって、これらの手順は大まかなものであり、これを改善する方法についてのアイデアを受け入れることを忘れないでください。

エクスポートを取得する

エクスポートは、本番のFirestoreインスタンスまたはローカルエミュレーターから生成できます。

エミュレーターのエクスポート

エミュレーターを起動し、必要に応じてデータを入力します。 データベースを希望の状態にしたら、エクスポートを作成します。

curl "localhost:8080/emulator/v1/projects/ryanpbrewster-test:export" \
  -d '{"database": "projects/ryanpbrewster-test/databases/(default)","export_directory":"."}' \
  -H "Content-Type: application/json

これにより、エクスポートがfirestore_export_1576524691/ようなディレクトリのローカルファイルシステムにダンプされます。

生産輸出

Google CloudStorageバケットが必要です。 テストプロジェクトのデフォルトのAppEngineバケットryanpbrewster-test.appspot.comます。 走る

gcloud firestore export gs://ryanpbrewster-test.appspot.com/firestore-export

Firestoreは、本番データの完全なコピーをGoogle CloudStorageにダンプします。 必要に応じて、 --collection-idsフラグを使用して、エクスポートを特定のコレクションのセットに制限できます。

完了したら、ローカルファイルシステムにコピーできます(巨大なデータベースがある場合、これはうまくいかないことに注意してください)。

gsutil cp -r gs://ryanpbrewster-test.appspot.com/firestore-export .

データのインポート

今のところ、エミュレータにデータをインポートする唯一の方法は、コマンドラインフラグを使用することです。

java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.10.2.jar \
  --seed_from_export=firestore_export_1576524691/firestore_export_1576524691.overall_export_metadata

すべてがうまくいけば、エミュレーターが起動し、すべてのデータが含まれます。

予期しているパスは.overall_export_metadataファイルの場所であり、エクスポートディレクトリの最上位にある必要があることに注意してください。

エクスポートからファイアストアデータをエミュレートすることができました。 今、firebaseエミュレータスーツを起動しようとすると。 エミュレータがすでにポートで実行されているため、Firestoreエミュレータが機能していません。 FIRESTORE_EMULATOR_HOST変数を認識しないように設定してみました。 エミュレーターの起動時にシードパスをコマンドに沿って渡すこともできる場合は、はるかに役立ち、 firebase emulators:start --firestore_seed_from_export = \path\to\seed\fileように多くの開発時間を短縮できます。

@prgwarの提案は+1。 このスタートアップファイヤーストアを使用してエミュレータスイートを実行するにはどうすればよいですか? 「⚠関数:Cloud Firestoreエミュレーターが実行されていないため、Firestoreを呼び出すと本番環境に影響する」ため、エミュレーターの関数は本番環境を使用します。

@prgwarご提案ありがとうfirebaseコマンドからインポート/エクスポートを指定するためのAPIの決定に取り組んでいます。 jar直接使用することは単なる回避策であり、開発者が長期的に行うことを実際に期待することではありません。

@ srolfe26問題は別の問題のように。CloudFunctionsエミュレーターを実行していますが、Firestoreエミュレーターは実行していません。 firebase init emulatorsを実行してFirestoreエミュレーターを初期化してから、 firebase emulators:start再度実行してみてください。

そこにいる仲間のWSL(1または2)ユーザーの場合、ブラウザーからエミュレーターに接続するのに問題がある可能性があります。 上記のコマンドに--host 0.0.0.0フラグを追加したところ、問題が修正されました。

java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.10.2.jar \
  --seed_from_export=firestore_export_1576524691/firestore_export_1576524691.overall_export_metadata \
  --host 0.0.0.0

@prgwarの--firestore_seed_from_export =の使用に関する提案はありますか受け入れられますか?

もしそうなら、私はPRをするつもりです。 他にどのようにボールを転がすのを手伝うことができますか?

同じseed_from_export機能をRealtimeDatabaseエミュレーターに実装できればと思います。

@spencerwhyteオファーをありがとう! 私は現在これに積極的に取り組んでおり、FirestoreとRTDB、および将来のエミュレーターをサポートするものに取り組んでいます。

この一般的な流れについてどう思いますか。

  • 「バックアップ」とは、次のものを含むフォルダです。

    • 正規の形式での個々のエミュレータバックアップの束

    • それらを説明する単一のmetadata.jsonファイル

  • シードを使用してエミュレーターを開始するには、次のようにします。 firebase emulators:start --import="./folder-with-backup"
  • 実行中のエミュレーターのバックアップを取るには、実行中に新しいターミナルを開き、 firebase emulators:export実行します。

それは私が現在取り組んでいることです、私はそれが最も柔軟なことだと思いますが、私はフィードバックに非常にオープンです

@samtstern聞いて

この設計は、エミュレーターのエクスポート形式/バックアップ形式が使用できるものである限り、完璧に聞こえます。 本番環境でのバックアップと同じ形式であれば、それで十分です。 トリガーを起動せずに、統合テスト用に大量のデータをインポートする必要があります。 現在、テスト中にトリガーを無効にするいくつかのチェックを実行することで生き残っていますが、その複雑さを避けたいと考えています。 この--importサポートにより、物事を簡素化できます。

テストにはfirebase emulators:execを使用しますが、 execでも機能する限り、問題はありません。

@spencerwhyte

1)はい、可能な限り本番と同じフォーマットを使用します。 したがって、Firestoreの場合はインポート/エクスポート形式をサポートし、RTDBの場合は巨大なjsonファイルになります。
2)はい、 emulators:exec --importをサポートします

フィードバックをお寄せいただきありがとうございます!

PR#1968はこの機能を実装しており(現時点ではFirestoreのみ、Realtime Databaseは近日公開予定)、次のCLIリリースに含まれる予定です(おそらく7.14.0 )。

この機能は7.14.0リリースされたばかりです...試してみて、ご意見をお聞かせください。 現在はFirestoreのみですが、次はRealtimeDatabaseです。

これはどこかに文書化されていますか? また、Google Cloud Storageバケット(私は持っていません)なしで本番データをエクスポートする方法はありますか?
クラウドデータストアからデータを複製せずに、トリガーをローカルでテストするのに苦労しています。

@shaimo申し訳ありませんが、ドキュメントが少し遅れていますが、数日中に公開される予定です。

本番環境からエクスポートするには、CloudStorageバケットが必要です。 これは、エクスポートが「管理された」操作であるためです。つまり、エクスポートはGoogleサーバーのどこかで発生します。 ローカルファイルシステムに対してそのような操作を実行することはできません。クラウドの宛先が必要です。

Firebaseプロジェクトがある場合は、実際に使用できるデフォルトのCloud Storageバケットがあり、無料の割り当てが含まれています。 Firebaseコンソールの[ストレージ]セクションに移動してチェックアウトするだけです。

@samtsternドキュメントには時間がかかる場合がありますが、エミュレータインスタンスにインポート/エクスポートする方法について簡単に説明してください。

新しいフラグに関するドキュメントがここにあります。
https://firebase.google.com/docs/emulator-suite/install_and_configure#startup

とにかく例を挙げましょう。 インポート/エクスポートを使用するには、2つのターミナルウィンドウが必要になるため、ターミナル1ターミナル2と呼びましょう。

最初にエミュレータを起動します

ターミナル1

$ firebase emulators:start
# ...

保存したいデータをいくつか作成したら、別のターミナルでexportコマンドを実行します。

ターミナル2

$ firebase emulators:export ./mydirectory
# ...

これで、 ./mydirectoryエクスポートがあります。 次回エミュレータを起動するときは、そこからインポートするように伝えます。

ターミナル1

$ firebase emulators:start --import=./mydirectory
# ...

以上です!

@samtstern firebaseエミュレーターを使用して本番エクスポートからインポートできますか
エミュレーター:start-- importがfirebase-export-metadata.jsonを探しているのがわかり

@landonjできますが、現時点では少しemulators:export 1回実行してから、ローカルエクスポートではなく本番エクスポートを指すようにJSONファイルを変更することです。

エミュレータ用のRTDBのシードについてはまだ何かありますか?

@FergyKayはまだ何もありませんが、ここでフォローできます:
https://github.com/firebase/firebase-tools/issues/2079

これは大いに必要です

@landonjとまったく同じことをしようとしています..

@samtsternが言ったことを

私が間違っていることは何ですか?

bdw ..ファイルが存在します!

firebase emulators:start --debug --only firestore,functions --import=/Users/ridermansb/Projects/meve.ai/backups/emulator-data

[2020-05-31T13:31:23.601Z] com.google.cloud.datastore.core.exception.DatastoreException:エクスポートメタデータファイル全体の解析に失敗しました
com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:225)で
com.google.cloud.datastore.emulator.impl.ExportImportUtil.fetchEntities(ExportImportUtil.java:54)で
com.google.cloud.datastore.emulator.firestore.CloudFirestore.main(CloudFirestore.java:89)で
{"metadata":{"emulator":{"name": "firestore"}、 "message": "com.google.cloud.datastore.core.exception.DatastoreException:エクスポートメタデータファイル全体の解析に失敗しました\ n \ tat com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:225)\ n \ tat com.google.cloud.datastore.emulator.impl.ExportImportUtil.fetchEntities(ExportImportUtil.java:54)\ n \ tat com.google.cloud.datastore.emulator.firestore.CloudFirestore.main(CloudFirestore.java:89)\ n "}}
[2020-05-31T13:31:23.602Z]原因:java.io.FileNotFoundException:/Users/ridermansb/Projects/meve.ai/backups/emulator-data/Users/ridermansb/Projects/meve.ai/backups/ 2020-05-31 / 2020-05-31 / 2020-05-31T13:19:28_6168.overall_export_metadata(そのようなファイルまたはディレクトリはありません)
{"metadata":{"emulator":{"name": "firestore"}、 "message": "原因:java.io.FileNotFoundException:/Users/ridermansb/Projects/meve.ai/backups/emulator-data /Users/ridermansb/Projects/meve.ai/backups/2020-05-31/2020-05-31/2020-05-31T13:19:28_6168.overall_export_metadata(そのようなファイルまたはディレクトリはありません)\ n "}}
[2020-05-31T13:31:23.603Z] java.base / java.io.FileInputStream.open0(ネイティブメソッド)
java.base / java.io.FileInputStream.open(FileInputStream.java:213)で
java.base /java.io.FileInputStreamで。(FileInputStream.java:155)
com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:215)で
... 2以上
{"metadata":{"emulator":{"name": "firestore"}、 "message": "\ tat java.base / java.io.FileInputStream.open0(ネイティブメソッド)\ n \ tatjava.base / java.io.FileInputStream.open(FileInputStream.java:213)\ n \ tat java.base /java.io.FileInputStream。(FileInputStream.java:155)\ n \ tat com.google.cloud.datastore.emulator.impl.ExportImportUtil.parseOverallMetadataFile(ExportImportUtil.java:215)\ n \ t ... 2 more \ n "}}

エラー:firestore:Firestoreエミュレーターがコードで終了しました:1

@landonjできますが、現時点では少しemulators:export 1回実行してから、ローカルエクスポートではなく本番エクスポートを指すようにJSONファイルを変更することです。

これを拡張できますか? gcloudバケットを直接ポイントできますか? または、最初にエクスポートのコンテンツをローカルにダウンロードする必要がありますか? どのファイルを変更する必要がありますか?

以下は私が試みたものです:

> firebase emulators:start
> firebase emulators:export ~/emulator-data/
> # close the emulator
> gcloud firestore export gs://xxxxx-xxxxx-xxxxx/emulator/
> gsutil cp -r gs://xxxxx-xxxxx-xxxxx/emulator ~/emulator-data/
> firebase emulators:start --only firestore --import /home/gugahoi/emulator-data/emulator/ --debug
[2020-06-01T10:04:36.492Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2020-06-01T10:04:36.493Z] > authorizing via signed-in user
i  emulators: Starting emulators: firestore {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: firestore"}}
[2020-06-01T10:04:36.510Z] [hub] writing locator at /tmp/hub-flux-development.json
i  emulators: Shutting down emulators. {"metadata":{"emulator":{"name":"hub"},"message":"Shutting down emulators."}}
i  hub: Stopping emulator hub {"metadata":{"emulator":{"name":"hub"},"message":"Stopping emulator hub"}}
[2020-06-01T10:04:36.825Z] Error: ENOENT: no such file or directory, open '/home/gugahoi/emulator-data/emulator/firebase-export-metadata.json'
    at Object.openSync (fs.js:458:3)
    at Object.readFileSync (fs.js:360:35)
    at Object.<anonymous> (/home/gugahoi/.nvm/versions/node/v12.16.3/lib/node_modules/firebase-tools/lib/emulator/controller.js:183:44)
    at Generator.next (<anonymous>)
    at fulfilled (/home/gugahoi/.nvm/versions/node/v12.16.3/lib/node_modules/firebase-tools/lib/emulator/controller.js:5:58)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

Error: An unexpected error has occurred.

上記が機能していないようだったので、 firebase-exports-metadata.jsonファイルを次の内容で更新しました。

> cat firebase-export-metadata.json
{"version":"8.4.1","firestore":{"version":"1.11.4","path":"emulator","metadata_file":"emulator/emulator.overall_export_metadata"}}

以下はディレクトリ構造です。

gugahoi:~/emulator-data > tree .
.
├── emulator
│   ├── all_namespaces
│   │   └── all_kinds
│   │       ├── all_namespaces_all_kinds.export_metadata
│   │       ├── output-0
│   │       └── output-1
│   └── emulator.overall_export_metadata
├── firebase-export-metadata.json
├── firebase-export-metadata.json.bak
└── firestore_export
    └── firestore_export.overall_export_metadata

ただし、エミュレータUIにはまだデータがありません。

編集

エミュレーターからの最終出力を追加すると思っただけで、エラーなしで実行されますが、データはありません。

> firebase emulators:start --only firestore --import /home/gugahoi/emulator-data/ --debug
[2020-06-01T11:31:34.256Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2020-06-01T11:31:34.257Z] > authorizing via signed-in user
i  emulators: Starting emulators: firestore {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: firestore"}}
[2020-06-01T11:31:34.274Z] [hub] writing locator at /tmp/hub-flux-development.json
i  firestore: Importing data from /home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata {"metadata":{"emulator":{"name":"firestore"},"message":"Importing data from /home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata"}}
[2020-06-01T11:31:34.302Z] Ignoring unsupported arg: projectId {"metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: projectId"}}
[2020-06-01T11:31:34.303Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"firestore"},"message":"Ignoring unsupported arg: auto_download"}}
[2020-06-01T11:31:34.303Z] Starting Firestore Emulator with command {"binary":"java","args":["-Duser.language=en","-jar","/home/gugahoi/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.4.jar","--host","localhost","--port",8080,"--seed_from_export","/home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata","--rules","/home/gugahoi/projects/flux/flux/firestore.rules"],"optionalArgs":["port","webchannel_port","host","rules","functions_emulator","seed_from_export"],"joinArgs":false} {"metadata":{"emulator":{"name":"firestore"},"message":"Starting Firestore Emulator with command {\"binary\":\"java\",\"args\":[\"-Duser.language=en\",\"-jar\",\"/home/gugahoi/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.4.jar\",\"--host\",\"localhost\",\"--port\",8080,\"--seed_from_export\",\"/home/gugahoi/emulator-data/emulator/emulator.overall_export_metadata\",\"--rules\",\"/home/gugahoi/projects/flux/flux/firestore.rules\"],\"optionalArgs\":[\"port\",\"webchannel_port\",\"host\",\"rules\",\"functions_emulator\",\"seed_from_export\"],\"joinArgs\":false}"}}
i  firestore: Firestore Emulator logging to firestore-debug.log {"metadata":{"emulator":{"name":"firestore"},"message":"Firestore Emulator logging to \u001b[1mfirestore-debug.log\u001b[22m"}}
[2020-06-01T11:31:35.197Z] API endpoint: http://localhost:8080
 {"metadata":{"emulator":{"name":"firestore"},"message":"API endpoint: http://localhost:8080\n"}}
[2020-06-01T11:31:35.198Z] If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:

   export FIRESTORE_EMULATOR_HOST=localhost:8080

Dev App Server is now running.

 {"metadata":{"emulator":{"name":"firestore"},"message":"If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:\n\n   export FIRESTORE_EMULATOR_HOST=localhost:8080\n\nDev App Server is now running.\n\n"}}
[2020-06-01T11:31:35.322Z] Ignoring unsupported arg: auto_download {"metadata":{"emulator":{"name":"ui"},"message":"Ignoring unsupported arg: auto_download"}}
[2020-06-01T11:31:35.322Z] Ignoring unsupported arg: port {"metadata":{"emulator":{"name":"ui"},"message":"Ignoring unsupported arg: port"}}
[2020-06-01T11:31:35.323Z] Starting Emulator UI with command {"binary":"node","args":["/home/gugahoi/.cache/firebase/emulators/ui-v1.0.0/server.bundle.js"],"optionalArgs":[],"joinArgs":false} {"metadata":{"emulator":{"name":"ui"},"message":"Starting Emulator UI with command {\"binary\":\"node\",\"args\":[\"/home/gugahoi/.cache/firebase/emulators/ui-v1.0.0/server.bundle.js\"],\"optionalArgs\":[],\"joinArgs\":false}"}}
i  ui: Emulator UI logging to ui-debug.log {"metadata":{"emulator":{"name":"ui"},"message":"Emulator UI logging to \u001b[1mui-debug.log\u001b[22m"}}
[2020-06-01T11:31:35.395Z] Web / API server started at http://localhost:4000
 {"metadata":{"emulator":{"name":"ui"},"message":"Web / API server started at http://localhost:4000\n"}}

┌───────────────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! View status and logs at http://localhost:4000 │
└───────────────────────────────────────────────────────────────────────┘

┌───────────┬────────────────┬─────────────────────────────────┐
│ Emulator  │ Host:Port      │ View in Emulator UI             │
├───────────┼────────────────┼─────────────────────────────────┤
│ Firestore │ localhost:8080 │ http://localhost:4000/firestore │
└───────────┴────────────────┴─────────────────────────────────┘
  Other reserved ports: 4400, 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

@gugahoiあなたの投稿は私が解決策を思いつくのを助けました: https//gist.github.com/bkuri/36cef71bcf30a5416b1c353cb81f38ed

これは、クラウドストレージエミュレータインスタンスをシードする小さなbashスクリプトです。 必要なのは、エクスポートされたデータを保存するプロジェクト名と宛先パスだけです。 すなわち: ./seed-storage.sh my-project /tmp/export

ところで、上記のスクリプトは、通常の容疑者( firebasegcloudgsutil )に加えて、2つの非常に一般的なツール( lsofscreen )に依存しています。 gsutil )なので、それらがインストールされていることを確認してください。

これが誰かを助けることを願っています。 :+1:

とにかく、既存のデータベースのインポート時にファイアストア関数がトリガーされるのを回避するには?

@bkuriそのスクリプトに感謝します。

@gugahoiのおかげで、コレクションを本番
そのために、次の手順を実行しました。

  1. ローカルのFirebaseプロジェクトパスに移動します。
  2. firebase emulators:startを使用してエミュレータを起動します
  3. 提供されているボタンを使用して、 http:// localhost :4000 / firestoreのGUIを使用して、いくつかのモックアップデータを手動で作成します。_+コレクションの開始_および_ +ドキュメントの追加_。
  4. emulators:export ./mydirectoryを使用してこのデータをローカルにエクスポートします
  5. _Firebase Database / Cloud Firestore_にあるプロジェクトデータについて、次のような単一のコレクションをエクスポートしました: gcloud firestore export gs://my-project-bucket-id.appspot.com --collection-ids=myCollectionエクスポートは、名前としてタイムスタンプが付いたフォルダーの_Firebase Storage_の下にあります(プレフィックスは使用しませんでした)私のテストのために)
  6. このフォルダをローカルドライブにダウンロードします: gsutil cp -r gs://my-project-bucket-id.appspot.com/myCollection ./production_data_export注:これはWindows環境で行いました... _ gsutil_は次のエラーをスローします:_ "OSError:ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません" _フォルダのWindowsのフォルダ名に無効な文字(コロンなど)が含まれている場合、またはこのエラー:_ "OSError:無効な引数。9.0B]" _フォルダ内の内部ファイルにも無効な文字が含まれている場合。 エクスポートをローカルにダウンロードできるようにするには、次のように、これらの名前を有効なWindows名に変更します(つまり、コロンを削除します)。 gsutil mv gs://my-project-bucket-id.appspot.com/2020-05-22T02:01:06_86152 gs://my-project-bucket-id.appspot.com/myCollection
  7. ダウンロードしたら、ローカルエクスポート構造を模倣して、フォルダーの名前をfirestore_exportし、ローカルエクスポートフォルダーからfirebase-export-metadata.jsonファイルをコピーします。 視覚的にするために、これが私が得た構造です:
$ tree .
.
├── local_data_export
│   ├── firebase-export-metadata.json
│   └── firestore_export
│       ├── all_namespaces
│       │   └── all_kinds
│       │       ├── all_namespaces_all_kinds.export_metadata
│       │       └── output-0
│       └── firestore_export.overall_export_metadata
└── production_data_export
    ├── firebase-export-metadata.json
    └── firestore_export
        ├── all_namespaces
        │   └── kind_myCollection
        │       ├── all_namespaces_kind_myCollection.export_metadata
        │       ├── output-0
        │       └── output-1
        └── firestore_export.overall_export_metadata

8 directories, 9 files
  1. 最後に、インポートするこの本番データを指すローカルエミュレーターを起動します: firebase emulators:start --import=./mock_up_data/production_data_export/
  2. インポートされたデータは次の場所に表示されます: http:// localhost :4000 / firestore /

これらの指示が役立つように十分に明確であることを望みます。 Firebaseの人々からのより堅牢なソリューションを待つ間、これが誰かに役立つことを願っています。

簡単な更新と同じように:上記のコメントからの指示を投稿したとき、私はWSL2でそれを行っていましたが、それらは機能していないようですが、Ubuntuでの同じ手順は問題ないようです。WSL2に何かが干渉している可能性があります。 。

エミュレーターデータを本番環境にインポートしたいのとは逆にこれを実行したいのですが、Firestoreに7000 googleシート行を追加する必要があり、関数を編集することでそれを実行できましたが、本番環境で実行しようとすると関数内で問題が発生した場合にもメモリ制限を超えてしまい、データが重複してしまう可能性があります。 エクスポートのインポートに気づき、ローカルエミュレータのfirestoreデータをエクスポートできることに気付きました。 しかし、ローカルバックアップを本番環境にインポートするのはどうですか?

@nvanhoeselのインポート/エクスポート形式は、

このページは役に立ちましたか?
0 / 5 - 0 評価