将您的应用连接到 Cloud Storage for Firebase 模拟器

在将您的应用连接到 Cloud Storage for Firebase 模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流,而且已安装和配置 Local Emulator Suite 并已查看其 CLI 命令

选择一个 Firebase 项目

Firebase Local Emulator Suite 模拟的是单个 Firebase 项目的产品。

如需选择要使用的项目,请在启动模拟器之前,使用 CLI 在工作目录下运行 firebase use。或者,您也可以向每个模拟器命令传递 --project 标志。

Local Emulator Suite 支持模拟实际 Firebase 项目和演示项目。

项目类型 特性 与模拟器结合使用
实际项目

实际 Firebase 项目就是您创建和配置的项目(很可能是通过 Firebase 控制台创建和配置)。

实际项目具有实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。

使用实际的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

对于您未模拟的任何产品,您的应用和代码都将与实时资源(数据库实例、存储桶、函数等)交互。

演示项目

演示 Firebase 项目没有实际 Firebase 配置,也没有实时资源。通常可通过 Codelab 或其他教程来访问这些项目。

演示项目的 ID 带有 demo- 前缀。

使用演示 Firebase 项目时,您的应用和代码仅与模拟器交互。如果您的应用尝试与您没有为其运行模拟器的资源进行交互,该代码将失败。

我们建议您尽可能使用演示项目。演示项目具有以下优势:

  • 设置更简单,您无需创建 Firebase 项目也可运行模拟器
  • 安全性更强,就算您的代码意外调用了非模拟(生产环境)资源,也不可能发生数据更改、使用资源或产生费用
  • 提供更好的离线支持,无需访问互联网即可下载您的 SDK 配置。

对应用进行插桩 (instrument) 处理以便与模拟器通信

Android、Apple 平台和 Web SDK

按如下方式设置您的应用内配置或测试类,以便与 Cloud Storage for Firebase 模拟器进行交互。

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 模块化 API

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 命名空间型 API

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

使用模拟器测试由 Cloud Storage for Firebase 事件触发的 Cloud Functions 函数时无需进行额外设置。当 Cloud Storage for Firebase 模拟器和 Cloud Functions 模拟器都在运行时,它们会自动协同工作。

Admin SDK

设置 FIREBASE_STORAGE_EMULATOR_HOST 环境变量后,Firebase Admin SDK 会自动连接到 Cloud Storage for Firebase 模拟器:

export FIREBASE_STORAGE_EMULATOR_HOST="127.0.0.1:9199"

请注意,Cloud Functions 模拟器会自动识别 Cloud Storage for Firebase 模拟器,因此在测试 Cloud Functions 模拟器与 Cloud Storage for Firebase 模拟器之间的集成时,您可以跳过此步骤。系统会自动在 Cloud Storage for Firebase 中为 Admin SDK 设置环境变量。

如果您希望 Admin SDK 代码连接到在其他环境中运行的共享模拟器,则需要指定您使用 Firebase CLI 设置的同一项目 ID。您可以直接将项目 ID 传递给 initializeApp 或设置 GCLOUD_PROJECT 环境变量。

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
环境变量
export GCLOUD_PROJECT="your-project-id"

导入和导出数据

借助数据库模拟器和 Cloud Storage for Firebase 模拟器,您可以从正在运行的模拟器实例中导出数据。定义要在单元测试或持续集成工作流中使用的基准数据集,然后将其导出以供团队共享。

firebase emulators:export ./dir

在测试中,当模拟器启动时,导入基准数据。

firebase emulators:start --import=./dir

您可以指示模拟器在关停时导出数据,方法是指定导出路径,或是直接使用传递给 --import 标志的路径。

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

这些数据导入和导出选项也适用于 firebase emulators:exec 命令。如需了解详情,请参阅模拟器命令参考文档

Cloud Storage for Firebase 模拟器与生产环境的区别

对于客户端应用测试,在 Firebase API 接口方面,Cloud Storage for Firebase 模拟器几乎与生产环境完全一致。所有 Firebase 命令都应该适用于常规 Firebase SDK(Web、Android 和 Apple 平台)。

在测试服务器端应用时,存在一些限制。Firebase Admin SDK 使用了 Google Cloud API 接口,模拟器只模拟了此 API 的部分端点。一般来说,可通过客户端 SDK 执行的任何操作(上传或删除文件、获取和设置元数据)也可通过 Admin SDK 执行,但除此之外的操作则无法执行。下面列出了值得注意的例外情况。

与 Google Cloud Storage 的区别

Cloud Storage for Firebase 产品(包括 Storage 模拟器)提供了一部分 Google Cloud Storage (GCS) 功能,这些功能主要涉及存储对象的处理,对于 Firebase 应用开发非常有用。Cloud Storage for Firebase 与 GCS 的不同之处体现在以下几个方面:

  • Cloud Storage for Firebase 目前不支持使用 Bucket API 来创建、列出、获取或删除存储桶。
  • Google Cloud Storage Objects API 则支持以下方法:copydeletegetinsertlistpatchrewriteupdate

Cloud IAM

Firebase Emulator Suite 不会尝试复制或遵从任何与 IAM 相关的运行行为。模拟器遵循提供的 Firebase 安全规则,但在通常会使用 IAM 的情况下(例如,用来设置 Cloud Functions 函数调用服务账号以及权限等),模拟器不可配置,并且将使用开发者机器上的全局可用账号(类似于直接运行本地脚本)。

Pub/Sub 通知

Cloud Storage for Firebase 模拟器未与 Cloud Pub/Sub 模拟器集成,因此不支持为存储对象变更创建渠道/通知。我们建议直接使用 Cloud Functions Storage 触发器。

存储桶级元数据

Cloud Storage for Firebase 模拟器不支持任何存储桶级配置,包括存储类别、存储桶级 CORS 配置、标签或保留政策。Firebase 计划在日后对其进行改进,以支持此类配置。

后续步骤