Połącz aplikację z emulatorem Cloud Storage dla Firebase

Zanim połączysz aplikację z emulatorem Cloud Storage for Firebase, zapoznaj się z całym procesem Firebase Local Emulator Suite oraz zainstaluj i skonfiguruj Local Emulator Suite oraz zapoznaj się z komandami CLI.

Wybieranie projektu Firebase

Firebase Local Emulator Suite emuluje usługi w pojedynczym projekcie Firebase.

Aby wybrać projekt, który ma być używany, przed uruchomieniem emulatorów uruchom w CLI polecenie firebase use w katalogu roboczym. Możesz też przekazać parametr --project do każdego polecenia emulatora.

Local Emulator Suite obsługuje emulację prawdziwych projektów Firebase oraz projektów demonstracyjnych.

Typ projektu Funkcje Używanie z emulatorami
Real

Prawdziwy projekt Firebase to taki, który został utworzony i skonfigurowany (najprawdopodobniej w konsoli Firebase).

Prawdziwe projekty mają aktywne zasoby, takie jak instancje bazy danych, kontenery magazynu, funkcje lub inne zasoby skonfigurowane w danym projekcie Firebase.

Podczas pracy z prawdziwymi projektami Firebase możesz uruchamiać emulatory dla wszystkich lub niektórych obsługiwanych usług.

W przypadku usług, których nie emulujesz, Twoje aplikacje i kod będą wchodzić w interakcję z aktywnymi zasobami (instancjami baz danych, zasobnikami magazynu, funkcjami itp.).

Prezentacja

Demonstracyjny projekt Firebase nie ma rzeczywistej konfiguracji Firebase ani żadnych zasobów w produkcji. Do tych projektów zwykle uzyskuje się dostęp za pomocą ćwiczeń z programowania lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

Podczas pracy z demonstracyjnymi projektami Firebase aplikacje i kod będą wchodzić w interakcje z emulatorami tylko. Jeśli aplikacja próbuje wchodzić w interakcję z zasobem, dla którego nie działa emulowany system, kod nie zadziała.

W miarę możliwości zalecamy korzystanie z projektów demonstracyjnych. W ten sposób możesz zapewnić im dostęp do tych korzyści:

  • Łatwiejsza konfiguracja, ponieważ możesz uruchamiać emulatory bez tworzenia projektu Firebase.
  • Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane (produkcyjne) zasoby, nie ma możliwości zmiany danych, ich użycia ani rozliczenia.
  • lepsza obsługa trybu offline, ponieważ do pobrania konfiguracji pakietu SDK nie jest potrzebne połączenie z internetem;

Przeprowadź testy aplikacji z użyciem emulatorów

Pakiety SDK na Androida i platformy Apple oraz pakiety SDK internetowe

Aby skonfigurować konfigurację w aplikacji lub przetestować klasy, które mają wchodzić w interakcję z emulatorem Cloud Storage for Firebase, wykonaj te czynności:

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val storage = Firebase.storage
storage.useEmulator("10.0.2.2", 9199)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseStorage storage = FirebaseStorage.getInstance();
storage.useEmulator("10.0.2.2", 9199);
Swift
Storage.storage().useEmulator(withHost: "127.0.0.1", port: 9199)

Web

const { getStorage, connectStorageEmulator } = require("firebase/storage");

const storage = getStorage();
if (location.hostname === "localhost") {
  // Point to the Storage emulator running on localhost.
  connectStorageEmulator(storage, "127.0.0.1", 9199);
} 

Web

var storage = firebase.storage();
if (location.hostname === "localhost") {
  // Point to the Storage emulator running on localhost.
  storage.useEmulator("127.0.0.1", 9199);
} 

Aby przetestować funkcje Cloud uruchamiane przez zdarzenia Cloud Storage for Firebase za pomocą emulatora, nie musisz nic konfigurować. Gdy emulatory Cloud Storage for FirebaseCloud Functions działają, współpracują ze sobą automatycznie.

Admin SDK s

Firebase Admin SDKs automatycznie łączą się z emulatorem Cloud Storage for Firebase, gdy zmienna środowiskowa FIREBASE_STORAGE_EMULATOR_HOST jest ustawiona:

export FIREBASE_STORAGE_EMULATOR_HOST="127.0.0.1:9199"

Pamiętaj, że emulator Cloud Functions automatycznie rozpoznaje emulator Cloud Storage for Firebase, więc możesz pominąć ten krok podczas testowania integracji między emulatorami Cloud FunctionsCloud Storage for Firebase. Zmienne środowiskowe zostaną automatycznie ustawione dla pakietu Admin SDK w pliku Cloud Storage for Firebase.

Jeśli chcesz, aby kod Admin SDK łączył się z wspólnym emulatorem działającym w innym środowisku, musisz podać ten sam identyfikator projektu, który został ustawiony za pomocą wiersza poleceń Firebase. Identyfikator projektu możesz przekazać do funkcji initializeApp bezpośrednio lub ustawić zmienną środowiskową GCLOUD_PROJECT.

Pakiet Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
Zmienna środowiskowa
export GCLOUD_PROJECT="your-project-id"

Importowanie i eksportowanie danych

Emulatory bazy danych i Cloud Storage for Firebase umożliwiają eksportowanie danych z bieżącej instancji emulatora. Określ podstawowy zestaw danych do użycia w testach jednostkowych lub przepływach pracy ciągłej, a następnie wyeksportuj go, aby udostępnić go zespołowi.

firebase emulators:export ./dir

Podczas testów, po uruchomieniu emulatora, zaimportuj dane bazowe.

firebase emulators:start --import=./dir

Możesz zlecić emulatorowi eksportowanie danych po wyłączeniu, określając ścieżkę eksportu lub po prostu używając ścieżki przekazanej do flagi --import.

firebase emulators:start --import=./dir --export-on-exit

Te opcje importowania i eksportowania danych działają też z poleceniem firebase emulators:exec. Więcej informacji znajdziesz w przewodniku po poleceniach emulatora.

Różnice między emulatorem Cloud Storage for Firebase a wersją produkcyjną

W przypadku testowania aplikacji klienckich emulacja Cloud Storage for Firebase jest niemal idealnie zgodna z wersją produkcyjną w zakresie interfejsu API Firebase. Wszystkie komendy Firebase powinny działać w ramach standardowych pakietów SDK Firebase (na platformach internetowych, Androida i Apple).

W przypadku testowania aplikacji po stronie serwera występują pewne ograniczenia. Pakiety SDK Firebase Admin korzystają z interfejsu API Google Cloud, ale nie wszystkie jego punkty końcowe są emulowane. Zasadniczo wszystko, co można zrobić w pakietach SDK klienta (przesyłanie i usuwanie plików, pobieranie i ustawianie metadanych), jest też dostępne w pakietach Admin SDK, ale nie wszystko poza tym. Wyjątki, które mogą być istotne, zostały wymienione poniżej.

Różnice w stosunku do Google Cloud Storage

Usługa Cloud Storage for Firebase, w tym emulator Storage, udostępnia podzbiór funkcji Google Cloud Storage (GCS) skupionych na obiektach Storage, które są bardzo przydatne podczas tworzenia aplikacji Firebase. Cloud Storage for Firebaseróżni się od GCS w następujący sposób:

  • Cloud Storage for Firebase nie obsługuje obecnie interfejsów API Bucket do tworzenia, wyświetlania, uzyskiwania ani usuwania zasobników pamięci.
  • Z interfejsu Google Cloud Storage Objects API obsługiwane są te metody: copy, delete, get, insert, list, patch, rewrite, update.

Cloud IAM

Pakiet emulatorów Firebase nie próbuje odwzorowywać ani respektować zachowania związanych z IAM. Emulatory przestrzegają dostarczonych reguł zabezpieczeń Firebase, ale w sytuacjach, w których zwykle używane są reguły IAM, np. do konfigurowania wywołań funkcji Cloud Functions przez konto usługi i w ten sposób uprawnień, emulator nie jest konfigurowalny i będzie używać konta dostępnego globalnie na Twoim komputerze dewelopera, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.

Powiadomienia Pub/Sub

Emulator Cloud Storage for Firebase nie integruje się z emulatorem Pub/Sub, więc nie obsługuje tworzenia kanałów ani powiadomień dotyczących zmian w obiektach Cloud Storage. Zalecamy bezpośrednie używanie Cloud Functions reguł w Storage.

Metadane na poziomie zasobnika

Emulator Cloud Storage for Firebase nie obsługuje żadnej konfiguracji na poziomie zasobnika, w tym klasy magazynu, konfiguracji CORS na poziomie zasobnika, etykiet ani zasad przechowywania. Zespół Firebase zamierza stopniowo ulepszać tę funkcję.

Co dalej?