适用于多个项目/环境的Firebase配置

use*_*645 16 firebase google-cloud-functions

我正在使用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"
});
Run Code Online (Sandbox Code Playgroud)

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

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

Die*_*ego 12

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

  1. 选择项目(您可以使用命令firebase 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"
});
Run Code Online (Sandbox Code Playgroud)


bra*_*oon 8

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

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

Firebase Cloud Functions 和更一般的 CLI 能够部署到 Firebase 环境中的特定项目。为此,请在终端中的云功能目录中执行以下命令。

    $ firebase use --add
Run Code Online (Sandbox Code Playgroud)

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

    $ firebase use default # sets environment to the default alias
    $ firebase use development # sets environment to the development alias
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅:https : //firebase.googleblog.com/2016/07/deploy-to-multiple-environments-with.html

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

    $ admin.initializeApp(functions.config().firebase);
Run Code Online (Sandbox Code Playgroud)


p43*_*027 5

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

const env = process.env.GCLOUD_PROJECT === 'my-app-prod' ? 'prod' : 'dev';
Run Code Online (Sandbox Code Playgroud)

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

完整示例:(打字稿)

  1. 更新.firebaserc文件

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

    export const config = {
      dev: {
        awsRegion: 'myDevRegion',
        awsAccessKey: 'myDevKey',
        awsSecretKey: 'myDevSecretKey'
      },
      prod: {
        awsRegion: 'myProdRegion',
        awsAccessKey: 'myProdKey',
        awsSecretKey: 'myProdSecretKey'
      }
    };
    
    Run Code Online (Sandbox Code Playgroud)
  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....       
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在部署

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

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