Установите, настройте и интегрируйте Local Emulator Suite

Firebase Local Emulator Suite можно установить и настроить для различных тестовых сред и сред прототипирования, от разовых сеансов прототипирования до рабочих процессов непрерывной интеграции в производственном масштабе.

Установите Local Emulator Suite

Перед установкой Emulator Suite вам потребуется:

  • Node.js версии 16.0 или более поздней.
  • Java JDK версии 11 или выше.

Чтобы установить Emulator Suite, выполните следующие действия:

  1. Установите Firebase CLI. Если у вас ещё не установлен интерфейс командной строки Firebase, установите его. Для работы с Emulator Suite требуется CLI версии 8.14.0 или более поздней. Чтобы узнать, какая версия установлена у вас, выполните следующую команду:
    firebase --version
  2. Если вы ещё этого не сделали, инициализируйте текущий рабочий каталог как проект Firebase, следуя инструкциям на экране, чтобы указать, какие продукты использовать:
    firebase init
  3. Настройте Emulator Suite. Эта команда запускает мастер настройки, который позволяет выбрать нужные эмуляторы, скачать соответствующие двоичные файлы эмуляторов и установить порты эмуляторов, если значения по умолчанию не подходят.
    firebase init emulators

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

Настройте Emulator Suite

При необходимости вы можете настроить сетевые порты эмуляторов и путь к определениям правил безопасности в файле firebase.json:

  • Чтобы изменить порты эмулятора, выполните команду firebase init emulators или вручную отредактируйте файл firebase.json.
  • Измените путь к определениям правил безопасности, вручную отредактировав firebase.json.

Если вы не настроите эти параметры, эмуляторы будут прослушивать порты по умолчанию, а эмуляторы Cloud Firestore, Realtime Database и Cloud Storage for Firebase будут работать с открытой защитой данных.

Команда Описание
init emulators Запустите мастер инициализации эмулятора. Укажите эмуляторы, которые нужно установить, и при необходимости задайте настройки портов. init emulators не удаляет данные. Если вы примете настройки по умолчанию, текущая конфигурация эмулятора сохранится.

Конфигурация портов

Каждый эмулятор привязывается к отдельному порту на вашем компьютере с предпочтительным значением по умолчанию.

Эмулятор Порт по умолчанию
Authentication 9099
App Hosting 5002
Emulator Suite UI 4000
Cloud Functions 5001
Eventarc 9299
Realtime Database 9000
Cloud Firestore 8080
Cloud Storage for Firebase 9199
Firebase Hosting 5000
Pub/Sub 8085

Настройка идентификатора проекта

В зависимости от того, как вы вызываете эмуляторы, вы можете запустить несколько экземпляров эмулятора, используя разные идентификаторы проектов Firebase, или несколько экземпляров эмулятора для одного идентификатора проекта. В таких случаях экземпляры эмулятора запускаются в отдельной среде.

Рекомендуется задать один идентификатор проекта для всех вызовов эмулятора, чтобы Emulator Suite UI, эмуляторы разных продуктов и все запущенные экземпляры определенного эмулятора могли правильно взаимодействовать во всех случаях.

Если Local Emulator Suite обнаружит в среде несколько идентификаторов проектов, то выдаст предупреждение. Чтобы этого не происходило, задайте для ключа singleProjectMode значение false в файле firebase.json.

Проверить декларации идентификаторов проектов на наличие несоответствий можно в следующих разделах:

  • Проект по умолчанию в командной строке. По умолчанию при запуске идентификатор проекта будет взят из проекта, выбранного с помощью firebase init или firebase use. Чтобы посмотреть список проектов и узнать, какой из них выбран, используйте команду firebase projects:list.
  • Модульное тестирование правил. Идентификатор проекта часто указывается в вызовах методов библиотеки модульного тестирования правил initializeTestEnvironment или initializeTestApp.
  • Параметр командной строки --project. Если передать флаг Firebase CLI --project, проект по умолчанию будет переопределен. Вам нужно будет убедиться, что значение флага соответствует идентификатору проекта в модульном тестировании и инициализации приложения.

Также проверьте идентификаторы проектов, которые вы задали при настройке проектов для платформ Apple, Android и веб-сайтов.

Конфигурация правил безопасности

Эмуляторы будут брать конфигурацию правил безопасности из ключей конфигурации database, firestore и storage в firebase.json.

{
  // Existing firebase configuration ...
  "database": {
    "rules": "database.rules.json"
  },
  "firestore": {
    "rules": "firestore.rules"
  },
  "storage": {
    "rules": "storage.rules"
  }

  // ...

  // Optional emulator configuration. Default
  // values are used if absent.
  "emulators": {
    "singleProjectMode": false, // do not warn on detection of multiple project IDs
    "firestore": {
      "port": "8080"
    },
    "ui": {
      "enabled": true,      // Default is `true`
      "port": 4000          // If unspecified, see CLI log for selected port
    },
    "auth": {
      "port": "9099"
    },
    "pubsub": {
      "port": "8085"
    }
  }
}

Как задать параметры Java

Эмуляторы Realtime Database, Cloud Firestore и часть эмулятора Cloud Storage for Firebase основаны на Java, поэтому их можно настраивать с помощью флагов JVM через переменную среды JAVA_TOOL_OPTIONS.

Например, если у вас возникают ошибки, связанные с объемом динамически распределяемой памяти Java, вы можете увеличить ее максимальный размер до 4 ГБ:

export JAVA_TOOL_OPTIONS="-Xmx4g"
firebase emulators:start

Несколько флагов можно указать в кавычках через пробел, например JAVA_TOOL_OPTIONS="-Xms2g -Xmx4g". Флаги влияют только на компоненты эмуляторов на основе Java и не влияют на другие части CLI Firebase, такие как Emulator Suite UI.

Запустите эмуляторы

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

Команда Описание
emulators:start

Запустите эмуляторы для продуктов Firebase, настроенных в firebase.json. Процессы эмулятора будут выполняться, пока вы не остановите их. При вызове emulators:start эмуляторы будут скачаны в ~/.cache/firebase/emulators/, если они ещё не установлены.

Флаг Описание
--only Необязательно. Ограничьте количество запускаемых эмуляторов. Укажите список названий эмуляторов, разделенных запятыми. Можно использовать одно или несколько из следующих значений: auth, database, firestore, functions, hosting или pubsub.
--inspect-functions DEBUG_PORT Необязательно. Используйте с эмулятором Cloud Functions, чтобы включить отладку функций с помощью точек останова на указанном порту (или на порту по умолчанию 9229, если аргумент опущен). Обратите внимание, что при использовании этого флага эмулятор Cloud Functions переключается в специальный режим сериализованного выполнения, в котором функции выполняются в одном процессе в последовательном порядке (FIFO). Это упрощает отладку функций, хотя поведение отличается от многопроцессного параллельного выполнения функций в облаке.
--export-on-exit= Необязательно. Используйте с эмулятором Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Укажите эмуляторам, что при завершении работы нужно экспортировать данные в каталог, как описано для команды emulators:export. Каталог экспорта можно указать с помощью параметра firebase emulators:start --export-on-exit=./saved-data. Если используется --import, путь экспорта по умолчанию будет таким же, например firebase emulators:start --import=./data-path --export-on-exit. Наконец, при необходимости передайте разные пути к каталогам в флагах --import и --export-on-exit.
--import=IMPORT_DIRECTORY Необязательно. Используйте с эмулятором Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Импортируйте данные, сохраненные с помощью параметра запуска --export-on-exit или команды emulators:export, в работающий экземпляр эмулятора Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Все данные, которые сейчас находятся в памяти эмулятора, будут перезаписаны.
--log-verbosity=VERBOSITY Необязательно. Уменьшает объем выходных данных журнала из эмуляторов, чтобы уменьшить шум в консоли и в файлах журнала. Допустимые значения: DEBUG, INFO, QUIET, SILENT.
emulators:exec PATH/TO/SCRIPT

Запустите скрипт в PATH/TO/SCRIPT после запуска эмуляторов для продуктов Firebase, настроенных в firebase.json. Процессы эмулятора автоматически остановятся, когда скрипт завершит работу.

Флаг Описание
--only Необязательно. Ограничьте количество запускаемых эмуляторов. Укажите список названий эмуляторов, разделенный запятыми. Можно выбрать одно или несколько из следующих значений: firestore, database, functions, hosting или pubsub.
--inspect-functions DEBUG_PORT Необязательно. Используйте с эмулятором Cloud Functions, чтобы включить отладку функций с помощью точек останова на указанном порту (или на порту по умолчанию 9229, если аргумент опущен). Обратите внимание, что при использовании этого флага эмулятор Cloud Functions переключается в специальный режим сериализованного выполнения, в котором функции выполняются в одном процессе в последовательном порядке (FIFO). Это упрощает отладку функций, хотя поведение отличается от многопроцессного параллельного выполнения функций в облаке.
--export-on-exit= Необязательно. Используйте с эмулятором Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Укажите эмуляторам, что при завершении работы нужно экспортировать данные в каталог, как описано для команды emulators:export. Каталог экспорта можно указать с помощью параметра firebase emulators:start --export-on-exit=./saved-data. Если используется --import, путь экспорта по умолчанию будет таким же, например firebase emulators:start --import=./data-path --export-on-exit. Наконец, при необходимости передайте разные пути к каталогам в флагах --import и --export-on-exit.
--import=IMPORT_DIRECTORY Необязательно. Используйте с эмулятором Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Импортируйте данные, сохраненные с помощью параметра запуска --export-on-exit или команды emulators:export, в работающий экземпляр эмулятора Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Все данные, которые сейчас находятся в памяти эмулятора, будут перезаписаны.
--ui Необязательно. Запустите интерфейс эмулятора во время выполнения.
--log-verbosity=VERBOSITY Необязательно. Уменьшает объем выходных данных журнала из эмуляторов, чтобы уменьшить шум в консоли и в файлах журнала. Допустимые значения: DEBUG, INFO, QUIET, SILENT.

Метод firebase emulators:exec обычно больше подходит для рабочих процессов непрерывной интеграции.

Экспорт и импорт данных эмулятора

Вы можете экспортировать данные из эмуляторов Authentication, Cloud Firestore, Realtime Database и Cloud Storage for Firebase, чтобы использовать их в качестве общего набора данных. Эти наборы данных можно импортировать с помощью флага --import, как описано выше.

emulators:export export_directory

Эмулятор Authentication, Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Экспортируйте данные из работающего экземпляра эмулятора Cloud Firestore, Realtime Database или Cloud Storage for Firebase. Если указанный объект export_directory не существует, он будет создан. Если указанный каталог существует, вам будет предложено подтвердить, что предыдущие данные экспорта должны быть перезаписаны. Вы можете пропустить этот запрос, используя флаг --force. Каталог экспорта содержит файл манифеста данных firebase-export-metadata.json.

Вы можете настроить эмуляторы так, чтобы они автоматически экспортировали данные при завершении работы. Для этого используйте флаги --export-on-exit, описанные выше.

Интеграция с системой непрерывной интеграции

Запуск контейнеризированных образов Emulator Suite

Установка и настройка Emulator Suite с контейнерами в типичной среде непрерывной интеграции не представляет сложности.

Обратите внимание на следующее:

  • Файлы JAR устанавливаются и кешируются в папке ~/.cache/firebase/emulators/.

    • Чтобы избежать повторных скачиваний, вы можете добавить этот путь в конфигурацию кеша непрерывной интеграции.
  • Если в репозитории нет файла firebase.json, добавьте аргумент командной строки в команду emulators:start или emulators:exec, чтобы указать, какие эмуляторы нужно запустить. Пример:
    --only functions,firestore.

Сгенерируйте токен аутентификации (только для эмулятора Hosting)

Если ваши рабочие процессы непрерывной интеграции зависят от Firebase Hosting , то для запуска firebase emulators:exec вам нужно будет войти в систему с помощью токена. Для работы с другими эмуляторами вход в аккаунт не требуется.

Чтобы сгенерировать токен, запустите firebase login:ci в локальной среде. Не делайте этого в системе непрерывной интеграции. Следуйте инструкциям, чтобы выполнить аутентификацию. Этот шаг нужно выполнить только один раз для каждого проекта, поскольку токен будет действителен для всех сборок. Токен следует хранить в секрете, как пароль.

Если в вашей среде непрерывной интеграции можно указывать переменные среды, которые будут использоваться в скриптах сборки, просто создайте переменную среды с названием FIREBASE_TOKEN и значением в виде строки токена доступа. Интерфейс командной строки Firebase автоматически выберет переменную среды FIREBASE_TOKEN, и эмуляторы запустятся корректно.

В крайнем случае вы можете просто включить токен в скрипт сборки, но убедитесь, что у ненадежных сторон нет доступа. Для этого заданного в коде подхода добавьте --token "YOUR_TOKEN_STRING_HERE" в команду firebase emulators:exec.

Используйте REST API Emulator Hub.

Как посмотреть список запущенных эмуляторов

Чтобы получить список запущенных эмуляторов, отправьте запрос GET конечной точке /emulators в Emulator Hub.

curl localhost:4400/emulators

Результатом будет объект JSON со списком всех запущенных эмуляторов и их конфигурацией хоста/порта, например:

{
  "hub":{
    "name": "hub",
    "host": "localhost",
    "port": 4400
  },
  "functions": {
    "name": "functions",
    "host": "localhost",
    "port": 5001
  }
  "firestore": {
    "name": "firestore",
    "host": "localhost",
    "port": 8080
  }
}

Включить/отключить триггеры фоновых функций

В некоторых ситуациях вам потребуется временно отключить локальные триггеры функций и расширений. Например, вы можете удалить все данные в эмуляторе Cloud Firestore, не запуская функции onDelete, которые выполняются в эмуляторах Cloud Functions или Extensions.

Чтобы временно отключить триггеры локальных функций, отправьте запрос PUT к конечной точке /functions/disableBackgroundTriggers Emulator Hub.

curl -X PUT localhost:4400/functions/disableBackgroundTriggers

Результатом будет объект JSON с подробными сведениями о текущем состоянии.

{
  "enabled": false
}

Чтобы включить триггеры локальных функций после того, как они были отключены, отправьте запрос PUT к конечной точке /functions/enableBackgroundTriggers Emulator Hub.

curl -X PUT localhost:4400/functions/enableBackgroundTriggers

Результатом будет объект JSON с подробными сведениями о текущем состоянии.

{
  "enabled": true
}

Интеграция SDK эмулятора

В таблицах ниже указано, какие эмуляторы поддерживаются клиентскими SDK и Admin SDK. В будущем означает, что поддержка эмулятора планируется, но пока недоступна.

Доступность клиентского SDK

Android Платформы Apple Сайт Firebase UI
Android
Firebase UI
iOS
Firebase UI
Web
Realtime Database 19.4.0 7.2.0 8.0.0 6.4.0 Запланировано Н/Д
Cloud Firestore 21.6.0 7.2.0 8.0.0 6.4.0 Запланировано Н/Д
Authentication 20.0.0 7.0.0 8.0.0 7.0.0 Запланировано 4.7.2
Cloud Storage for Firebase 20.0.0 8.0.0 8.4.0 7.0.0 11.0.0 Н/Д
Cloud Functions 19.1.0 7.2.0 8.0.0 Н/Д – –
Hosting – – – – – –
Extensions – – – – – Н/Д

Доступность Admin SDK

Узел Java Python Go
Realtime Database 8.6.0 6.10.0 2.18.0 Запланировано
Cloud Firestore 8.0.0 6.10.0 3.0.0 1.0.0
Authentication 9.3.0 7.2.0 5.0.0 4.2.0
Cloud Storage for Firebase 9.8.0 Запланировано Запланировано Запланировано
Cloud Functions Н/Д – – –
Hosting – – – –
Extensions – – – Н/Д