firebase 如何从Firestore导出安全和索引规则?

ruoxqz4g  于 2022-11-17  发布在  其他
关注(0)|答案(6)|浏览(156)

我已经在Firestore开发数据库上设置了多个不同的索引。现在,我想将它们导出到firestore.indexes.json中,这样设置prod环境的过程会更容易。有没有办法使用Firebase CLI导出这些索引?这同样适用于安全规则,尽管我知道我可以复制粘贴它们。

iovurdzv

iovurdzv1#

有可能!
从firebase项目文件夹中的CLI firebase firestore:indexes运行。
如果您已经设置了索引并通过CLI登录到Firebase,您将得到一个格式化的JSON输出供您复制。
示例:

{
  "indexes": [
    {
      "collectionId": "teslaData",
      "fields": [
        {
          "fieldPath": "Model",
          "mode": "ASCENDING"
        },
        {
          "fieldPath": "Price",
          "mode": "ASCENDING"
        }
      ]
    }
  ]
}

导出的索引可以使用firebase deploy --only firestore:indexes重新导入。请检查以下文档提取。
https://firebase.google.com/docs/firestore/query-data/indexing
您也可以使用Firebase CLI部署索引。首先,在您的项目目录中运行Firebase init firestore。在安装过程中,Firebase CLI会生成一个JSON文件,其中包含正确格式的默认索引。编辑该文件以添加更多索引,然后使用Firebase deploy命令部署它。如果您只想部署索引,请添加--only firestore:indexes标志。如果您使用Firebase控制台编辑索引,请确保同时更新您的本地索引文件。
我正在使用Firebase CLI 4.2.1,如果有帮助的话,祝你好运:)
编辑:截至9.6.0,它仍在工作。

qhhrdooz

qhhrdooz2#

在您的Firebase项目文件夹中,在终端中执行以下命令:

firebase firestore:indexes > firestore.indexes.json

它将保存一个名为firestore.indexes.json的文件,其中包含您的索引。
然后可以将该文件上传到其他Firebase项目。

cnh2zyt3

cnh2zyt33#

我认为目前还没有API可以从项目中获取Firestore安全规则。您可以通过CLI部署规则,也可以将其嵌入自定义节点脚本中,并从CI进程中调用。但据我所知,目前还没有API可以从项目中读取规则。
这听起来是个很好的理由。

yvfmudvl

yvfmudvl4#

如果接受的答案对您无效(我得到了一个权限错误)对于firestore索引,你可以去你的firebase控制台〉云firestore〉索引,然后在检查器中打开网络选项卡,清除所有请求并刷新页面。(我在网络标签的搜索栏中搜索“indexes "找到了我的)在网络请求的XHR过滤器中。它应该看起来像”indexes?key=...“,你可以复制这个JSON响应。
如果你已经用firebase init在你的项目中初始化了firebase,你可以简单地把它粘贴到你的项目的firestore.indexes.json文件中,然后把每个name属性改为collectionGroup属性。例如:'name': 'projects/[your project name]...''collectionGroup': '[name of collection for this index]'
运行firebase deploy --only firestore:indexes,将在文本编辑器中所做的任何更改更新回firestore索引选项卡
对于firestore安全规则,以一种不太复杂但类似的方式,您可以将firebase控制台中显示的规则复制并粘贴到项目的firestore.rules文件中。
firestore.indexes.json文件示例

{
  "indexes": [
    {
      "collectionGroup": "faq",
      "queryScope": "COLLECTION",
      "fields": [
        {
          "fieldPath": "searchKeywords",
          "arrayConfig": "CONTAINS"
        },
        {
          "fieldPath": "answered",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "relevanceScore",
          "order": "ASCENDING"
        },
        {
          "fieldPath": "__name__",
          "order": "ASCENDING"
        }
      ]
    }
  ]
}
cnwbcb6i

cnwbcb6i5#

这是项目文件的布局方式
myProjectFolder

  • .firebaserc
  • firebase.json
  • firestore.indexes.json
  • functions

在文件.firebaserc中,将名称更改为您的开发项目:

{
  "projects": {
    "default": "myApp-dev"
  }
}
  • 运行命令firebase firestore:indexes > firestore.indexes.json,将当前dev项目的索引导出到文件中
  • .firebaserc中的项目名称更改为myApp-prod

在文件firebase.json中,确保其索引指向先前导出的firestore.indexes.json

{
  "functions": [
    {
      "source": "functions",
      "codebase": "default",
      "ignore": [
        "node_modules",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log"
      ],
      "predeploy": [
        "npm --prefix \"$RESOURCE_DIR\" run lint",
        "npm --prefix \"$RESOURCE_DIR\" run build"
      ]
    }
  ],
  "firestore": {
    "indexes": "firestore.indexes.json"
  }
}
  • 运行命令firebase deploy --only firestore:indexes
efzxgjgh

efzxgjgh6#

任何集成开发环境都依赖于支持Node.js(Firebase CLI所需)的操作系统。因此,如果您查看Nodes Filesystem文档,就会看到如何通过编程(通过JavaScript)操作(复制/粘贴)文件的示例。至于如何通过编程部署到Firebase,请参见child_process.spawn

相关问题