use*_*624 34 firebase-tools google-cloud-functions google-cloud-firestore
我希望能够在本地运行云函数并针对生产数据的副本进行调试。有没有办法将在线的数据复制到本地firestore模拟器?
小智 92
这可以通过现有项目的终端中的一组命令来完成:
1.登录firebase和Gcloud:
firebase login
gcloud auth login
Run Code Online (Sandbox Code Playgroud)
2. 查看您的项目列表并连接到一个:
firebase projects:list
firebase use your-project-name
gcloud projects list
gcloud config set project your-project-name
Run Code Online (Sandbox Code Playgroud)
3. 使用所选名称将您的生产数据导出到 gcloud 存储桶:
gcloud firestore export gs://your-project-name.appspot.com/your-choosen-folder-name
Run Code Online (Sandbox Code Playgroud)
4.现在将此文件夹复制到您的本地计算机,我直接在functions文件夹中执行此操作:
cd functions
gsutil -m cp -r gs://your-project-name.appspot.com/your-choosen-folder-name .
Run Code Online (Sandbox Code Playgroud)
5. 现在我们只想导入这个文件夹。这应该适用于基本命令,这要归功于 Firebase 团队https://github.com/firebase/firebase-tools/pull/2519 的最新更新。
firebase emulators:start --import ./your-choosen-folder-name
Run Code Online (Sandbox Code Playgroud)
查看我关于它的关于 Medium 的文章和一个速记脚本来为你完成这项工作https://medium.com/firebase-developers/how-to-import-production-data-from-cloud-firestore-to-the-本地模拟器-e82ae1c6ed8
注意:最好为它使用不同的存储桶,因为复制到您的项目存储桶将导致在您的 firebase 存储中创建文件夹。
如果您对 gsutil 参数(如 )感兴趣-m
,可以通过执行 来查看它们的描述gsutil --help
。
Met*_*iel 21
我的方法有点手动,但它确实有效。我已经在这个有用的 Github 线程中分享了它,但如果你觉得它们有用,我会列出我在这里做的步骤:
firebase emulators:start
emulators:export ./mydirectory
gcloud firestore export gs://my-project-bucket-id.appspot.com --collection-ids=myCollection
导出现在位于Firebase Storage下以时间戳为名称的文件夹中(我没有在测试中使用前缀)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
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
Run Code Online (Sandbox Code Playgroud)
firebase emulators:start --import=./mock_up_data/production_data_export/
目前这应该对读者有所帮助,而我们正在等待 Firebase 人员提供更强大的解决方案。
小智 10
您可以使用firestore-backup-restore将生产数据导出和导入为 JSON 文件。
我写了一个快速的 hack 来允许在 Firebase Simulator Firestore 实例中导入这些 JSON。
我提出了一个拉取请求并同时制作了这个npm 模块。
你可以这样使用它:
const firestoreService = require('@crapougnax/firestore-export-import')
const path = require('path')
// list of JSON files generated with the export service
// Must be in the same folder as this script
const collections = ['languages', 'roles']
// Start your firestore emulator for (at least) firestore
// firebase emulators:start --only firestore
// Initiate Firebase Test App
const db = firestoreService.initializeTestApp('test', {
uid: 'john',
email: 'john@doe.com',
})
// Start importing your data
let promises = []
try {
collections.map(collection =>
promises.push(
firestoreService.fixtures(
path.resolve(__dirname, `./${collection}.json`),
[],
[],
db,
),
),
)
Promise.all(promises).then(process.exit)
} catch (err) {
console.error(err)
}
Run Code Online (Sandbox Code Playgroud)
显然,由于这些数据不会保留在模拟器中,您通常会在测试套件的 before() 函数中甚至在每次测试之前将它们注入。
我能够制作一些 npm 脚本从远程导入到本地模拟器,反之亦然。
"serve": "yarn build && firebase emulators:start --only functions,firestore --import=./firestore_export",
"db:update-local-from-remote": "yarn db:backup-remote && gsutil -m cp -r gs://my-firebase-bucket.appspot.com/firestore_export .",
"db:update-remote-from-local": "yarn db:backup-local && yarn db:backup-remote && gsutil -m cp -r ./firestore_export gs://my-firebase-bucket.appspot.com && yarn run db:import-remote",
"db:import-remote": "gcloud firestore import gs://my-firebase-bucket.appspot.com/firestore_export",
"db:backup-local": "firebase emulators:export --force .",
"db:rename-remote-backup-folder": "gsutil mv gs://my-firebase-bucket.appspot.com/firestore_export gs://my-firebase-bucket.appspot.com/firestore_export_$(date +%d-%m-%Y-%H-%M)",
"db:backup-remote": "yarn db:rename-remote-backup-folder && gcloud firestore export gs://my-firebase-bucket.appspot.com/firestore_export"
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用以下命令将本地 Firestore 数据导出到远程:
"serve": "yarn build && firebase emulators:start --only functions,firestore --import=./firestore_export",
"db:update-local-from-remote": "yarn db:backup-remote && gsutil -m cp -r gs://my-firebase-bucket.appspot.com/firestore_export .",
"db:update-remote-from-local": "yarn db:backup-local && yarn db:backup-remote && gsutil -m cp -r ./firestore_export gs://my-firebase-bucket.appspot.com && yarn run db:import-remote",
"db:import-remote": "gcloud firestore import gs://my-firebase-bucket.appspot.com/firestore_export",
"db:backup-local": "firebase emulators:export --force .",
"db:rename-remote-backup-folder": "gsutil mv gs://my-firebase-bucket.appspot.com/firestore_export gs://my-firebase-bucket.appspot.com/firestore_export_$(date +%d-%m-%Y-%H-%M)",
"db:backup-remote": "yarn db:rename-remote-backup-folder && gcloud firestore export gs://my-firebase-bucket.appspot.com/firestore_export"
Run Code Online (Sandbox Code Playgroud)
或者要使用远程 Firestore 数据更新本地 Firestore 数据,请执行以下操作:
npm db:update-remote-from-local
Run Code Online (Sandbox Code Playgroud)
这些操作将备份远程 Firestore 数据,制作其副本并将其存储在 Firebase 存储上。
归档时间: |
|
查看次数: |
18156 次 |
最近记录: |