Firebase-tools: Firestore и эмулятор базы данных: инициализация экземпляра с набором данных

Созданный на 12 мар. 2019  ·  39Комментарии  ·  Источник: firebase/firebase-tools

Было бы здорово иметь возможность создать экземпляр эмулятора Firestore с набором данных.

В настоящее время мы выполняем пакетную запись для инициализации или сброса экземпляра эмулятора. Проблема в том, что обновление 120 операций (наш тестовый набор данных) занимает почти 3 секунды.

Можно ли создать экземпляр эмулятора Firestore из моментального снимка или улучшить производительность эмулятора для больших обновлений?

emulator-suite database firestore feature request

Самый полезный комментарий

Возможность импорта данных в эмулятор Firestore (т. Е. Инициализировать его с помощью «начальных» данных) должна исчезнуть в следующем выпуске. Сначала это будет немного вручную, в следующих выпусках мы добавим улучшенные инструменты.

Изучение того, что может потребоваться для эмулятора базы данных реального времени.

Все 39 Комментарий

Я согласен с тем, что было бы здорово загрузить "снимок" базы данных при инициализации. В настоящее время я запускаю эмуляторы firestore и функций локально для разработки, но когда я заполняю базу данных тестовыми данными, выполняется куча триггеров функций firestore. Это довольно нежелательно, поэтому есть ли какие-либо планы относительно функции, которая поможет с загрузкой исходных данных или, что еще лучше, сохранением данных firestore на диск?

Спасибо, что подняли вопрос о желании засеять данные без функций.
стрельба. В качестве временной меры мы определенно могли бы реализовать способ "превратить
off »запускается специальным вызовом при загрузке данных.
может быть полезен и для некоторых тестов. Вы бы использовали это?

Но на длительную перспективу нужен импорт / экспорт.

В сб, 12 октября 2019 г., 11:54 Wyatt Ades [email protected] написал:

Я согласен с тем, что было бы здорово загрузить "снимок" базы данных на
инициализация. В настоящее время я запускаю эмуляторы firestore и функций
локально для разработки, но когда я заполняю БД данными тестирования, куча
триггеров функции firestore. Это довольно нежелательно, поэтому
есть ли в планах функция, которая поможет с загрузкой исходных данных или,
даже лучше, сохранение данных firestore на диске?

-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/firebase/firebase-tools/issues/1167?email_source=notifications&email_token=ACATB2VEE7BBI75HECFTE23QOIMOLA5CNFSM4G5NG5X2YY3PNVWWK3TUL52HS4DFMVREXWGWWWWK3TUL52HS4DFVMWWWGB4DFVMXWWGWWWW08CM4DFVMWX
или отказаться от подписки
https://github.com/notifications/unsubscribe-auth/ACATB2WHUTO43JISN54J4U3QOIMOLANCNFSM4G5NG5XQ
.

Да, на данный момент это было бы хорошим решением, спасибо!

Значит, вехи для этого еще не установлены? но вот что мне нравится в этой команде, она кажется более активной и отзывчивой.

ребята, пожалуйста, добавьте базу данных реального времени в эту область вместе с базой данных firestore.

@anantanandgupta пока нет вех, но да, мы стараемся открыто рассказывать о нашем прогрессе! И я также добавил эмулятор базы данных. Для базы данных проблема проще (формат JSON), но нам все равно нужно помочь вам "приостановить" облачные функции.

Я знаю, что нахожусь в надежных руках. Но чтобы сказать вам о важности, я спроектировал эту огромную платформу полностью вокруг firebase, и все были против этого yesr назад, но своими усилиями я до сих пор доказал, что мое решение использовать firebase в качестве технологии не было ошибочным. На данный момент он стал настолько большим, что работать над несколькими функциями несколькими разработчиками с общей базой данных, размещенной в облаке, стало невозможно. Так что, если каждый из нас сможет работать с локальной копией базы данных, это будет намного проще и эффективнее.

Возможность импорта данных в эмулятор Firestore (т. Е. Инициализировать его с помощью «начальных» данных) должна исчезнуть в следующем выпуске. Сначала это будет немного вручную, в следующих выпусках мы добавим улучшенные инструменты.

Изучение того, что может потребоваться для эмулятора базы данных реального времени.

@ryanpbrewster есть ли документация о том, как настроить "

@SamyPesse, это было реализовано внутри самого Emulator JAR (как сказал @ryanpbrewster ), но мы фактически не предоставили API через firebase-tools для импорта, так что это еще не то, что вы можете использовать.

Не могли бы вы рассказать, как вы ожидаете, что это будет работать? Вы бы предпочли флаг в команде 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 Cloud Storage. Я буду использовать ведро AppEngine по умолчанию для моего тестового проекта ryanpbrewster-test.appspot.com . Запустить

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

и Firestore сбросит полную копию ваших производственных данных в Google Cloud Storage. При желании вы можете использовать флаг --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

+1 за предложение @prgwar . Как я могу запустить набор эмуляторов с помощью этого стартового хранилища огня? Функции в эмуляторе используют производственную среду, потому что «⚠ функции: эмулятор Cloud Firestore не запущен, поэтому вызовы Firestore повлияют на производственную среду».

@prgwar спасибо за ваше предложение, в настоящее время мы работаем над выбором API для указания импорта / экспорта из команды firebase . Прямое использование jar - это просто обходной путь, а не то, чего мы на самом деле ожидаем от разработчиков в долгосрочной перспективе.

@ srolfe26 ваша проблема звучит как другая, вы используете эмулятор Cloud Functions, но не эмулятор 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 =быть приемлемым?

Если так, я готов устроить пиар. Как еще я могу помочь сдвинуть дело с мертвой точки?

Мне также хотелось бы, чтобы та же функция seed_from_export могла быть реализована в эмуляторе базы данных Realtime.

@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) и будет включен в следующий выпуск CLI (вероятно, 7.14.0 )

Эта функция была только что выпущена в 7.14.0 ... попробуйте и дайте нам знать, что вы думаете! Прямо сейчас это только Firestore, но на очереди Realtime Database.

Это где-нибудь задокументировано? Кроме того, есть ли способ экспортировать производственные данные без корзины Google Cloud Storage (которой у меня нет)?
Трудно тестировать триггеры локально без репликации данных из облачного хранилища данных.

@shaimo извините, мы немного отстаем в документации, но они должны быть

Для экспорта из рабочей среды вам понадобится корзина Cloud Storage. Это связано с тем, что экспорт - это «управляемая» операция, что означает, что он происходит где-то на сервере Google. Мы не можем выполнить такую ​​операцию против вашей локальной файловой системы, нам нужно место назначения в облаке.

Если у вас есть проект Firebase, у вас действительно есть корзина Cloud Storage по умолчанию, которую вы можете использовать, и она включает некоторую бесплатную квоту. Просто перейдите в раздел Хранилище консоли Firebase, чтобы проверить это.

@samtstern Поскольку документация может занять некоторое время, не могли бы вы вкратце рассказать, как импортировать / экспортировать в экземпляр эмулятора?

Теперь у нас есть документация по новым флагам:
https://firebase.google.com/docs/emulator-suite/install_and_configure#startup

Но все же позвольте мне привести вам пример. Чтобы использовать импорт / экспорт, вам понадобятся два окна терминала, поэтому назовем их Терминал 1 и Терминал 2.

Сначала запустите эмуляторы

Терминал 1

$ firebase emulators:start
# ...

После того, как вы накопили в них данные, которые хотите сохранить, запустите команду экспорта в другом терминале:

Терминал 2

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

Теперь у вас есть экспорт в ./mydirectory . В следующий раз, когда вы запустите эмуляторы, скажите им импортировать оттуда:

Терминал 1

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

Вот и все!

@samtstern Можно ли импортировать из производственного экспорта с помощью эмуляторов firebase: команда
Я вижу, что эмуляторы: start --import ищет firebase-export-metadata.json, но у меня есть firestore-export / firestore-export.overall_export_metadata

@landonj можно, но сейчас это немного сложно. Самый простой способ - запустить emulators:export один раз, а затем изменить файлы 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.parseO GeneralMetadataFile (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.parseO TotalMetadataFile (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 (Нет такого файла или каталога)
{"метаданные": {"эмулятор": {"имя": "firestore"}, "сообщение": "Вызвано: 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.parseO TotalMetadataFile (ExportImportUtil.java:215)
... еще 2
{"метаданные": {"эмулятор": {"имя": "firestore"}, "сообщение": "\ tat java.base / java.io.FileInputStream.open0 (собственный метод) \ n \ tat java.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.parseO TotalMetadataFile (ExportImportUtil.java:215) \ n \ t ... еще 2 \ n "}}

Ошибка: firestore: эмулятор Firestore завершился с кодом: 1

@landonj можно, но сейчас это немного сложно. Самый простой способ - запустить emulators:export один раз, а затем изменить файлы 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

Однако у меня до сих пор нет данных в пользовательском интерфейсе эмулятора.

Редактировать

Просто подумал, что добавлю окончательный вывод эмулятора, он работает без ошибок, но без моих данных:

> 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 .

Кстати, приведенный выше сценарий зависит от двух очень распространенных инструментов ( lsof и screen ) в дополнение к обычным подозреваемым ( firebase , gcloud и gsutil ), поэтому убедитесь, что они у вас установлены.

Надеюсь, это кому-то поможет. : +1:

В любом случае, чтобы избежать срабатывания функций firestore при импорте существующей базы данных?

@bkuri спасибо за этот скрипт, я думаю, что с моей установкой / установкой происходит что-то странное, так как я все еще не могу получить какие-либо данные для отображения в консоли эмулятора firestore.

Благодаря @gugahoi я смог импортировать коллекцию из продакшена в локальный эмулятор.
Для этого я проделал следующие шаги:

  1. Перейдите по пути к моему локальному проекту Firebase.
  2. Запустите эмуляторы, используя: firebase emulators:start
  3. Создайте вручную некоторые данные макета, используя графический интерфейс по адресу http: // localhost : 4000 / firestore, используя предоставленные кнопки: _ + Start Collection_ и _ + Add Document_.
  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: Invalid argument.9.0 B]" _ если внутренний файл в папке также содержит недопустимые символы. Чтобы иметь возможность загружать экспорт локально, переименуйте их, указав действительное имя 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 что-то мешает .

Я хочу сделать это наоборот, я хочу импортировать данные моего эмулятора в производство, мне нужно добавить 7000 строк таблицы Google в мой firestore, и я смог сделать это, отредактировав функцию, однако при попытке сделать это в производстве мой предел памяти превышается также, когда что-то идет не так внутри функции, я могу получить дублирующиеся данные. Я заметил экспортный импорт и заметил, что могу экспортировать данные из хранилища локального эмулятора. Но как насчет импорта моей локальной резервной копии в рабочую среду?

@nvanhoesel форматы импорта / экспорта одинаковы в продакшене и в эмуляторах. Но ваш вариант использования необычный, поэтому вам нужно будет поработать самостоятельно, чтобы экспортировать эмулятор в Google Cloud Storage, чтобы Firestore мог правильно его импортировать.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги