在将您的应用连接到 Cloud Storage 模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流程,并安装和配置Local Emulator Suite 并查看其CLI 命令。
选择一个 Firebase 项目
Firebase 本地模拟器套件模拟单个 Firebase 项目的产品。
要选择要使用的项目,在启动模拟器之前,请在 CLI 中在您的工作目录中运行firebase use
。或者,您可以将--project
标志传递给每个模拟器命令。
Local Emulator Suite 支持模拟真实的Firebase 项目和演示项目。
项目类型 | 特征 | 与模拟器一起使用 |
---|---|---|
真实的 | 真正的 Firebase 项目是您创建和配置的项目(很可能通过 Firebase 控制台)。 真实项目具有实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。 | 在处理真正的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。 对于您未模拟的任何产品,您的应用程序和代码将与实时资源(数据库实例、存储桶、函数等)进行交互。 |
演示 | 演示 Firebase 项目没有真正的Firebase 配置,也没有实时资源。这些项目通常通过代码实验室或其他教程访问。 演示项目的项目 ID 具有 | 使用演示 Firebase 项目时,您的应用和代码仅与模拟器交互。如果您的应用程序尝试与未运行模拟器的资源进行交互,则该代码将失败。 |
我们建议您尽可能使用演示项目。好处包括:
- 设置更简单,因为您无需创建 Firebase 项目即可运行模拟器
- 更强的安全性,因为如果您的代码意外调用非模拟(生产)资源,则不会发生数据更改、使用和计费
- 更好的离线支持,因为无需访问互联网即可下载您的 SDK 配置。
检测您的应用程序以与模拟器对话
Android、Apple 平台和 Web SDK
设置您的应用内配置或测试类以与 Cloud Storage 模拟器交互,如下所示。
安卓
FirebaseStorage.getInstance().useEmulator("10.0.2.2", 9199);
迅速
Storage.storage().useEmulator(withHost:"localhost", port:9199)
网络 v8
var storage = firebase.storage(); storage.useEmulator("localhost", 9199);
网络 v9
import { getStorage, connectStorageEmulator } from "firebase/storage"; const storage = getStorage(); connectStorageEmulator(storage, "localhost", 9199);
无需额外设置即可使用模拟器测试由 Cloud Storage 事件触发的Cloud 功能。当 Cloud Storage 和 Cloud Functions 模拟器都在运行时,它们会自动协同工作。
管理 SDK
设置FIREBASE_STORAGE_EMULATOR_HOST
环境变量后,Firebase Admin SDK 会自动连接到 Cloud Storage 模拟器:
export FIREBASE_STORAGE_EMULATOR_HOST="localhost:9199"
请注意,Cloud Functions 模拟器会自动识别 Cloud Storage 模拟器,因此您可以在测试 Cloud Functions 和 Cloud Storage 模拟器之间的集成时跳过此步骤。环境变量将自动为 Cloud Storage 中的 Admin SDK 设置。
如果您希望您的 Admin SDK 代码连接到在另一个环境中运行的共享模拟器,则需要指定您使用 Firebase CLI 设置的相同项目 ID 。您可以将项目 ID 直接传递给initializeApp
或设置GCLOUD_PROJECT
环境变量。
Node.js 管理 SDK
admin.initializeApp({ projectId: "your-project-id" });
环境变量
export GCLOUD_PROJECT="your-project-id"
导入和导出数据
数据库和 Cloud Storage 模拟器允许您从正在运行的模拟器实例中导出数据。定义要在单元测试或持续集成工作流中使用的基线数据集,然后将其导出以在团队之间共享。
firebase emulators:export ./dir
在测试中,在模拟器启动时,导入基线数据。
firebase emulators:start --import=./dir
您可以指示模拟器在关机时导出数据,可以指定导出路径,也可以简单地使用传递给--import
标志的路径。
firebase emulators:start --import=./dir --export-on-exit
这些数据导入和导出选项也适用于firebase emulators:exec
命令。有关更多信息,请参阅模拟器命令参考。
Cloud Storage 模拟器与生产环境有何不同
对于客户端应用程序的测试,Cloud Storage 模拟器在 Firebase API 表面积方面几乎完美地与生产环境保持一致。所有 Firebase 命令都应在常规 Firebase SDK(Web、Android 和 Apple 平台)之间运行。
对于服务器端应用程序的测试,存在限制。 Firebase Admin SDK 使用 Google Cloud API 表面,并非此 API 的所有端点都被模拟。根据经验,可以从客户端 SDK 完成的任何操作(上传或删除文件、获取和设置元数据)也可以从 Admin SDK 使用,但除此之外的任何事情都不是。下面列出了值得注意的例外情况。
云 IAM
Firebase Emulator Suite 不会尝试复制或尊重任何与 IAM 相关的运行行为。模拟器遵守提供的 Firebase 安全规则,但在通常使用 IAM 的情况下,例如设置调用服务帐户的 Cloud Functions 并因此设置权限,模拟器是不可配置的,并将使用您的开发人员机器上的全局可用帐户,类似于直接运行本地脚本。
发布/订阅通知
Cloud Storage 模拟器不与 Cloud Pub/Sub 模拟器集成,因此不支持为存储对象更改创建通道/通知。我们建议直接使用 Cloud Functions Storage 触发器。
桶级元数据
Cloud Storage 模拟器不支持任何存储分区级别的配置,包括存储类、存储分区级别的 CORS 配置、标签或保留策略。 Firebase 打算随着时间的推移改进这种支持。
接下来是什么?
- 如需一组精选视频和详细的操作示例,请关注Firebase 模拟器培训播放列表。
- 由于触发函数是与 Cloud Storage 的典型集成,因此请在本地运行函数中了解有关 Cloud Functions for Firebase 模拟器的更多信息。