【问题标题】:Firebase configuration for multiple projects/environments多个项目/环境的 Firebase 配置
【发布时间】:2017-09-25 02:39:17
【问题描述】:

我将 Cloud Functions for Firebase 与三个不同的项目一起用于开发、测试和生产目的。每个项目都有一个 service-account.json。当我将源部署到环境时,初始化如下所示:

var serviceAccount = require("./service-account-dev.json");

firebase.initializeApp({
    credential: firebase.credential.cert(serviceAccount),
    databaseURL: "https://nwDEV.firebaseio.com"
});

这有点难以处理,因为每次我想部署到不同的环境时都必须更改代码。有没有办法进行整体配置,例如在 firebase.json 或 .firebasesrc 中,它允许集成服务帐户并决定部署时选择哪种配置?

否则有没有可能检测到代码在哪个环境下运行并加载特定的service-account.json并设置databaseURL-property?

【问题讨论】:

  • 好的,除了在 CLI 中设置环境属性之外,没有内置的替代方法可以管理不同的项目吗?
  • 如果您要部署到不同的机器上,我原以为您可以使用基于 window.location 的 if-else。
  • 您是否有理由需要执行服务帐户身份验证而不是使用管理 SDK 的内置身份验证? This snippet 展示了如何使用 Admin SDK 自动初始化当前部署的项目。如果这对您不起作用,您能否在问题中澄清为什么不呢?
  • @MichaelBleigh 我正在使用自定义令牌,因为我们正在实施 SMS 身份验证。

标签: firebase google-cloud-functions


【解决方案1】:

您可以使用环境变量。 https://firebase.google.com/docs/functions/config-env

  1. 选择项目(可以使用命令firebase projects:list查看): firebase use my-project-development

  2. 设置环境变量 firebase functions:config:set app.environment="dev"

  3. 在您的函数文件中,应用条件来选择文件: const serviceAccount = functions.config().app.environment === 'dev' ? 'credentials-dev.json' : 'credentials-prod.json';

那么就可以根据项目使用文件了:

firebase.initializeApp({
    credential: firebase.credential.cert(serviceAccount),
    databaseURL: "https://nwDEV.firebaseio.com"
});

【讨论】:

  • 如果是 node.js 项目,在大多数情况下它使用process.env.NODE_ENV == 'production' 但是我们不能更改 Firebase 服务器的process.env 所以我们必须使用firebase functions:config:set some.key="value" 作为 Diego 的答案。这应该是被接受的答案。
  • 我更喜欢这样使用functions:config:set app.env="dev"functions:config:set app.env="prd"
【解决方案2】:

根据我对您的问题的理解,您正在寻找的解决方案可以将您部署的云功能转换为适当的设置,即生产、开发和测试,我认为这意味着其中的每一个都是Firebase 环境中的一个独特的项目,因此也是数据库。

如果上述情况属实,那么以下内容应该会有所帮助。

Firebase Cloud Functions 以及更普遍的 CLI 能够部署到您的 Firebase 环境中的特定项目。为此,在云函数目录中的终端中执行以下命令。

    $ firebase use --add

这将允许您选择您的其他项目(例如,开发)并为其分配一个别名(如果是这样的话,我推荐“开发”)。然后,在部署函数时,您可以使用别名选择要部署到的项目(以及数据库)。

    $ firebase use default # sets environment to the default alias
    $ firebase use development # sets environment to the development alias

更多信息请见:https://firebase.googleblog.com/2016/07/deploy-to-multiple-environments-with.html

您可能需要做的一件事是使用 Cloud Functions 的默认配置设置。

    $ admin.initializeApp(functions.config().firebase);

【讨论】:

  • 错误:通过“凭据”属性提供给 initializeApp() 的凭据实现没有足够的权限访问请求的资源。有关如何使用适当权限验证此 SDK 的详细信息,请参阅firebase.google.com/docs/admin/setup。在 FirebaseAuthError.FirebaseError [作为构造函数]
  • 请注意,这应该是firebase use --add
  • @Morgz 谢谢。已更新以反映。
【解决方案3】:

简答: GCLOUD_PROJECT 环境变量对于您的项目将是唯一的,因此您可以像这样使用它(示例代码适用于 2 个不同的项目,但您可以使用 switch 或任何其他条件语句对其进行扩展) :

const env = process.env.GCLOUD_PROJECT === 'my-app-prod' ? 'prod' : 'dev';

然后使用 env 变量加载预期的配置。

完整示例:(TypeScript)

  1. 更新.firebaserc文件

    {
     "projects": {
        "default": "my-app-dev",
        "prod": "my-app-prod",
      }
     }
    
  2. 相应地创建和修改您的 ./somewhere/config.ts 文件,假设您正在使用 AWS 服务(请确保保护您的配置详细信息

    export const config = {
      dev: {
        awsRegion: 'myDevRegion',
        awsAccessKey: 'myDevKey',
        awsSecretKey: 'myDevSecretKey'
      },
      prod: {
        awsRegion: 'myProdRegion',
        awsAccessKey: 'myProdKey',
        awsSecretKey: 'myProdSecretKey'
      }
    };
    
  3. 现在以上项目可以在index.ts文件中使用

    import { config } from './somewhere/config';
    import * as aws  from 'aws-sdk';
    . . .
    const env = process.env.GCLOUD_PROJECT === 'my-app-prod' ? 'prod' : 'dev';
    const awsCredentials = {
        region: config[env].awsRegion,
        accessKeyId: config[env].awsAccessKey,
        secretAccessKey: config[env].awsSecretKey
    };
    aws.config.update(awsCredentials);
    . . . 
    export const myFuncToUseAWS = functions....       
    
  4. 现在部署

    Dev环境部署:$ firebase deploy --only functions -P default

    Prod环境部署:$ firebase deploy --only functions -P prod

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2018-04-14
    • 2018-10-25
    相关资源
    最近更新 更多